Setup

Load Packages

##Install Packages if Needed
if (!require("ggplot2")) install.packages("ggplot2")
if (!require("cowplot")) install.packages("cowplot")
if (!require("Rmisc")) install.packages("Rmisc")
if (!require("lme4")) install.packages("lme4")
Loading required package: lme4
Loading required package: Matrix
if (!require("vegan")) install.packages("vegan")
if (!require("corrplot")) install.packages("corrplot")
if (!require("DHARMa")) install.packages("DHARMa")
Loading required package: DHARMa
This is DHARMa 0.4.6. For overview type '?DHARMa'. For recent changes, type news(package = 'DHARMa')
if (!require("effectsize")) install.packages("effectsize")
Loading required package: effectsize
if (!require("emmeans")) install.packages("emmeans")
Loading required package: emmeans
##Load Packages
library(ggplot2) #Required for ggplots
library(cowplot) #Required for plotting panel figures
library(Rmisc) #Required for SummarySE function
library(lme4) #Required for mixed effects modeling
library(vegan) #Required for multivariate analysis PERM
library(corrplot) #Required for correlation plot
#library(lmerTest)
library(DHARMa) #Required to check residuals of mixed effects models
library(effectsize) #Required for eta_squared effect sizes
library(emmeans) #Required for pairwise comparisons 

Graphing Parameters

#Note: Run "Graphing Parameters" section from 01_ExperimentalSetup.Rmd file

Sample Data and Metadata

Load and Organize Data

##Load Data
#Note: Physiological metrics calculated in 02_PhysiologyMetrics.R file
Coral<-read.csv("Outputs/CoralData.csv", header=TRUE)

##Set factor variables
Coral$TimeP<-factor(Coral$TimeP, levels=c("TP1", "TP2", "TP3", "TP4"))
Coral$Site<-factor(Coral$Site, levels=c("KL", "SS"))
Coral$Genotype<-factor(Coral$Genotype, levels=c("AC8", "AC10", "AC12"))
Coral$Orig<-factor(Coral$Orig, levels=c("N", "T"))
Coral$Origin<-factor(Coral$Origin, levels=c("Native", "Transplant"))
Coral$Site.Orig<-factor(Coral$Site.Orig, levels=c("KL.N", "KL.T", "SS.N", "SS.T"))

Multivariate Analysis

adonis OmegaSq Function

#' Calculate (partial) Omega-squared (effect-size calculation) for PERMANOVA and add it to the input object
#'
#' @param adonisOutput An adonis object
#' @param partial Should partial omega-squared be calculated (sample size adjusted). Default TRUE
#' @return Original adonis object with the (partial) Omega-squared values added
#' @import vegan
#' @export
adonis_OmegaSq <- function(adonisOutput, partial = TRUE){
    if(!(is(adonisOutput, "adonis") || is(adonisOutput, "anova.cca")))
        stop("Input should be an adonis object")
    if (is(adonisOutput, "anova.cca")) {
        aov_tab <- adonisOutput
        aov_tab$MeanSqs <- aov_tab$SumOfSqs / aov_tab$Df
        aov_tab$MeanSqs[length(aov_tab$Df)] <- NA
    } else {
        aov_tab <- adonisOutput$aov.tab
    }
    heading <- attr(aov_tab, "heading")
    MS_res <- aov_tab[pmatch("Residual", rownames(aov_tab)), "MeanSqs"]
    SS_tot <- aov_tab[rownames(aov_tab) == "Total", "SumsOfSqs"]
    N <- aov_tab[rownames(aov_tab) == "Total", "Df"] + 1
    if(partial){
        omega <- apply(aov_tab, 1, function(x) (x["Df"]*(x["MeanSqs"]-MS_res))/(x["Df"]*x["MeanSqs"]+(N-x["Df"])*MS_res))
        aov_tab$parOmegaSq <- c(omega[1:(length(omega)-2)], NA, NA)
    } else {
        omega <- apply(aov_tab, 1, function(x) (x["SumsOfSqs"]-x["Df"]*MS_res)/(SS_tot+MS_res))
        aov_tab$OmegaSq <- c(omega[1:(length(omega)-2)], NA, NA)
    }
    if (is(adonisOutput, "adonis"))
        cn_order <- c("Df", "SumsOfSqs", "MeanSqs", "F.Model", "R2",
                      if (partial) "parOmegaSq" else "OmegaSq", "Pr(>F)")
    else
        cn_order <- c("Df", "SumOfSqs", "F", if (partial) "parOmegaSq" else "OmegaSq",
                      "Pr(>F)")
    aov_tab <- aov_tab[, cn_order]
    attr(aov_tab, "names") <- cn_order
    attr(aov_tab, "heading") <- heading
    if (is(adonisOutput, "adonis"))
        adonisOutput$aov.tab <- aov_tab
    else
        adonisOutput <- aov_tab
    return(adonisOutput)
}

Check Correlation

##Remove NA's
names(Coral)
 [1] "ID"              "RandN"           "TimeP"           "Site"           
 [5] "Genotype"        "Orig"            "Origin"          "Set"            
 [9] "Site.Orig"       "SA_cm2"          "TP_ug.cm2_C"     "TP_ug.cm2_S"    
[13] "AFDW_mg.cm2_C"   "AFDW_mg.cm2_S"   "AFDW_mg.cm2_S.C" "Chl_ug.cm2"     
Coral.rm<-na.omit(Coral)

##Log +1 transform 
Coral.log<-Coral.rm
Coral.log[,-c(1:10)]<-log(Coral.rm[,-c(1:10)]+1)
  
Phys.cor<-rcorr(as.matrix(Coral.log[,-c(1:10)]), type="pearson")
Phys.cor
                TP_ug.cm2_C TP_ug.cm2_S AFDW_mg.cm2_C AFDW_mg.cm2_S AFDW_mg.cm2_S.C
TP_ug.cm2_C            1.00        0.56          0.55          0.48            0.03
TP_ug.cm2_S            0.56        1.00          0.37          0.41            0.08
AFDW_mg.cm2_C          0.55        0.37          1.00          0.37           -0.49
AFDW_mg.cm2_S          0.48        0.41          0.37          1.00            0.60
AFDW_mg.cm2_S.C        0.03        0.08         -0.49          0.60            1.00
Chl_ug.cm2             0.37        0.16          0.33          0.50            0.20
                Chl_ug.cm2
TP_ug.cm2_C           0.37
TP_ug.cm2_S           0.16
AFDW_mg.cm2_C         0.33
AFDW_mg.cm2_S         0.50
AFDW_mg.cm2_S.C       0.20
Chl_ug.cm2            1.00

n= 190 


P
                TP_ug.cm2_C TP_ug.cm2_S AFDW_mg.cm2_C AFDW_mg.cm2_S AFDW_mg.cm2_S.C
TP_ug.cm2_C                 0.0000      0.0000        0.0000        0.6401         
TP_ug.cm2_S     0.0000                  0.0000        0.0000        0.2762         
AFDW_mg.cm2_C   0.0000      0.0000                    0.0000        0.0000         
AFDW_mg.cm2_S   0.0000      0.0000      0.0000                      0.0000         
AFDW_mg.cm2_S.C 0.6401      0.2762      0.0000        0.0000                       
Chl_ug.cm2      0.0000      0.0248      0.0000        0.0000        0.0049         
                Chl_ug.cm2
TP_ug.cm2_C     0.0000    
TP_ug.cm2_S     0.0248    
AFDW_mg.cm2_C   0.0000    
AFDW_mg.cm2_S   0.0000    
AFDW_mg.cm2_S.C 0.0049    
Chl_ug.cm2                
diag(Phys.cor$P)<-0

corrplot(Phys.cor$r, type="upper", order="hclust", 
         p.mat = Phys.cor$P, sig.level = 0.01, insig = "blank")

TP1

##Subset Timepoint 1 
Coral.log_TP1<-subset(Coral.log, TimeP=="TP1")

PERMANOVA

##PERMANOVA
Coral.TP1.perm<-adonis2(vegdist(Coral.log_TP1[,c(11:14, 16)], "euclidean")~ Coral.log_TP1$Origin * Coral.log_TP1$Site, data=Coral.log_TP1, strata=Coral.log_TP1$Genotype, method="euclidean")

##Effect Size
adonis_OmegaSq(Coral.TP1.perm)
Permutation test for adonis under reduced model
Terms added sequentially (first to last)
Blocks:  strata 
Permutation: free
Number of permutations: 999

adonis2(formula = vegdist(Coral.log_TP1[, c(11:14, 16)], "euclidean") ~ Coral.log_TP1$Origin * Coral.log_TP1$Site, data = Coral.log_TP1, method = "euclidean", strata = Coral.log_TP1$Genotype)
                                        Df SumOfSqs      F parOmegaSq Pr(>F)   
Coral.log_TP1$Origin                     1   0.2789 2.7121   0.034440  0.012 * 
Coral.log_TP1$Site                       1   0.3722 3.6196   0.051750  0.003 **
Coral.log_TP1$Origin:Coral.log_TP1$Site  1   0.3433 3.3384   0.046454  0.004 **
Residual                                44   4.5240                            
Total                                   47   5.5183                            
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
##Check dispersion by Origin
anova(betadisper(vegdist(Coral.log_TP1[,c(11:14, 16)], "euclidean"), Coral.log_TP1$Origin))
Analysis of Variance Table

Response: Distances
          Df  Sum Sq  Mean Sq F value Pr(>F)
Groups     1 0.01547 0.015468  1.0199 0.3178
Residuals 46 0.69768 0.015167               
##Check dispersion by Site
anova(betadisper(vegdist(Coral.log_TP1[,c(11:14, 16)], "euclidean"), Coral.log_TP1$Site))
Analysis of Variance Table

Response: Distances
          Df  Sum Sq  Mean Sq F value  Pr(>F)  
Groups     1 0.04842 0.048424  3.1669 0.08175 .
Residuals 46 0.70338 0.015291                  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
##Check dispersion by Origin:Site
anova(betadisper(vegdist(Coral.log_TP1[,c(11:14, 16)], "euclidean"), Coral.log_TP1$Origin:Coral.log_TP1$Site))
Analysis of Variance Table

Response: Distances
          Df  Sum Sq   Mean Sq F value Pr(>F)
Groups     3 0.02212 0.0073726  0.5649  0.641
Residuals 44 0.57425 0.0130512               

Physiology differs significantly by Origin and the effect of Origin differs between Sites.

Effect Size

Calculate Effect Size of Origin for each Site

##KL
##PERMANOVA
Coral.TP1.perm_KL<-adonis2(vegdist(Coral.log_TP1[which(Coral.log_TP1$Site=="KL"),c(11:14, 16)], "euclidean")~ Coral.log_TP1$Origin[which(Coral.log_TP1$Site=="KL")], data=Coral.log_TP1[which(Coral.log_TP1$Site=="KL"),], strata=Coral.log_TP1$Genotype[which(Coral.log_TP1$Site=="KL")], method="euclidean")

##Effect Size
adonis_OmegaSq(Coral.TP1.perm_KL)
Permutation test for adonis under reduced model
Terms added sequentially (first to last)
Blocks:  strata 
Permutation: free
Number of permutations: 999

adonis2(formula = vegdist(Coral.log_TP1[which(Coral.log_TP1$Site == "KL"), c(11:14, 16)], "euclidean") ~ Coral.log_TP1$Origin[which(Coral.log_TP1$Site == "KL")], data = Coral.log_TP1[which(Coral.log_TP1$Site == "KL"), ], method = "euclidean", strata = Coral.log_TP1$Genotype[which(Coral.log_TP1$Site == "KL")])
                                                        Df SumOfSqs      F parOmegaSq
Coral.log_TP1$Origin[which(Coral.log_TP1$Site == "KL")]  1  0.05913 0.6453  -0.015001
Residual                                                22  2.01586                  
Total                                                   23  2.07498                  
                                                        Pr(>F)
Coral.log_TP1$Origin[which(Coral.log_TP1$Site == "KL")]  0.437
Residual                                                      
Total                                                         
##Check dispersion by Origin
anova(betadisper(vegdist(Coral.log_TP1[which(Coral.log_TP1$Site=="KL"),c(11:14, 16)], "euclidean"), Coral.log_TP1$Origin[which(Coral.log_TP1$Site=="KL")]))
Analysis of Variance Table

Response: Distances
          Df   Sum Sq   Mean Sq F value Pr(>F)
Groups     1 0.002019 0.0020194  0.1424 0.7095
Residuals 22 0.311986 0.0141812               
##SS
##PERMANOVA
Coral.TP1.perm_SS<-adonis2(vegdist(Coral.log_TP1[which(Coral.log_TP1$Site=="SS"),c(11:14, 16)], "euclidean")~ Coral.log_TP1$Origin[which(Coral.log_TP1$Site=="SS")], data=Coral.log_TP1[which(Coral.log_TP1$Site=="SS"),], strata=Coral.log_TP1$Genotype[which(Coral.log_TP1$Site=="SS")], method="euclidean")

##Effect Size
adonis_OmegaSq(Coral.TP1.perm_SS)
Permutation test for adonis under reduced model
Terms added sequentially (first to last)
Blocks:  strata 
Permutation: free
Number of permutations: 999

adonis2(formula = vegdist(Coral.log_TP1[which(Coral.log_TP1$Site == "SS"), c(11:14, 16)], "euclidean") ~ Coral.log_TP1$Origin[which(Coral.log_TP1$Site == "SS")], data = Coral.log_TP1[which(Coral.log_TP1$Site == "SS"), ], method = "euclidean", strata = Coral.log_TP1$Genotype[which(Coral.log_TP1$Site == "SS")])
                                                        Df SumOfSqs      F parOmegaSq
Coral.log_TP1$Origin[which(Coral.log_TP1$Site == "SS")]  1  0.56298 4.9381    0.14096
Residual                                                22  2.50815                  
Total                                                   23  3.07113                  
                                                        Pr(>F)    
Coral.log_TP1$Origin[which(Coral.log_TP1$Site == "SS")]  0.001 ***
Residual                                                          
Total                                                             
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
##Check dispersion by Origin
anova(betadisper(vegdist(Coral.log_TP1[which(Coral.log_TP1$Site=="SS"),c(11:14, 16)], "euclidean"), Coral.log_TP1$Origin[which(Coral.log_TP1$Site=="SS")]))
Analysis of Variance Table

Response: Distances
          Df   Sum Sq   Mean Sq F value Pr(>F)
Groups     1 0.000018 0.0000178  0.0015 0.9695
Residuals 22 0.262265 0.0119211               

Variance Partitioning

##Variance Partitioning
Coral.TP1.vp<-varpart(Coral.log_TP1[,c(11:14, 16)], Coral.log_TP1$Origin, Coral.log_TP1$Site, Coral.log_TP1$Genotype)
Coral.TP1.vp$part
No. of explanatory tables: 3 
Total variation (SS): 5.5183 
            Variance: 0.11741 
No. of observations: 48 

Partition table:
---
Use function ‘rda’ to test significance of fractions of interest
##Check model significance
anova(rda(Coral.log_TP1[,c(11:14, 16)]~ Coral.log_TP1$Origin + Coral.log_TP1$Site + Coral.log_TP1$Genotype))
Permutation test for rda under reduced model
Permutation: free
Number of permutations: 999

Model: rda(formula = Coral.log_TP1[, c(11:14, 16)] ~ Coral.log_TP1$Origin + Coral.log_TP1$Site + Coral.log_TP1$Genotype)
         Df Variance      F Pr(>F)    
Model     4 0.047741 7.3665  0.001 ***
Residual 43 0.069669                  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
##Check variance explained by model
RsquareAdj(rda(Coral.log_TP1[,c(11:14, 16)]~ Coral.log_TP1$Origin + Coral.log_TP1$Site + Coral.log_TP1$Genotype))$adj.r.squared*100
[1] 35.1419
##Check effect of Origin 
anova(rda(Coral.log_TP1[,c(11:14, 16)], Coral.log_TP1$Origin))
Permutation test for rda under reduced model
Permutation: free
Number of permutations: 999

Model: rda(X = Coral.log_TP1[, c(11:14, 16)], Y = Coral.log_TP1$Origin)
         Df Variance      F Pr(>F)  
Model     1 0.005933 2.4482  0.068 .
Residual 46 0.111477                
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
anova(rda(Coral.log_TP1[,c(11:14, 16)], Coral.log_TP1$Origin, Coral.log_TP1[,c(4:5)]))
Permutation test for rda under reduced model
Permutation: free
Number of permutations: 999

Model: rda(X = Coral.log_TP1[, c(11:14, 16)], Y = Coral.log_TP1$Origin, Z = Coral.log_TP1[, c(4:5)])
         Df Variance      F Pr(>F)  
Model     1 0.005933 3.6619  0.014 *
Residual 43 0.069669                
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
##Check effect of Site 
anova(rda(Coral.log_TP1[,c(11:14, 16)], Coral.log_TP1$Site))
Permutation test for rda under reduced model
Permutation: free
Number of permutations: 999

Model: rda(X = Coral.log_TP1[, c(11:14, 16)], Y = Coral.log_TP1$Site)
         Df Variance      F Pr(>F)  
Model     1 0.007918 3.3266  0.021 *
Residual 46 0.109492                
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
anova(rda(Coral.log_TP1[,c(11:14, 16)], Coral.log_TP1$Site, Coral.log_TP1[,c(5,7)]))
Permutation test for rda under reduced model
Permutation: free
Number of permutations: 999

Model: rda(X = Coral.log_TP1[, c(11:14, 16)], Y = Coral.log_TP1$Site, Z = Coral.log_TP1[, c(5, 7)])
         Df Variance      F Pr(>F)   
Model     1 0.007918 4.8872  0.005 **
Residual 43 0.069669                 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
##Check effect of Genotype 
anova(rda(Coral.log_TP1[,c(11:14, 16)], Coral.log_TP1$Genotype))
Permutation test for rda under reduced model
Permutation: free
Number of permutations: 999

Model: rda(X = Coral.log_TP1[, c(11:14, 16)], Y = Coral.log_TP1$Genotype)
         Df Variance      F Pr(>F)    
Model     2  0.03389 9.1297  0.001 ***
Residual 45  0.08352                  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
anova(rda(Coral.log_TP1[,c(11:14, 16)], Coral.log_TP1$Genotype, Coral.log_TP1[,c(4,7)]))
Permutation test for rda under reduced model
Permutation: free
Number of permutations: 999

Model: rda(X = Coral.log_TP1[, c(11:14, 16)], Y = Coral.log_TP1$Genotype, Z = Coral.log_TP1[, c(4, 7)])
         Df Variance      F Pr(>F)    
Model     2 0.033890 10.458  0.001 ***
Residual 43 0.069669                  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

The model is significant (p = 0.001) and explains 35.14% of the variance of physiology. The effect of Origin (controlling for Site and Genotype) is significant (p = 0.013) and explains 3.92%. The effect of Site (controlling for Origin and Genotype) is significant (p = 0.001) and explains 5.73%. The effect of Genotype (controlling for Origin and Site) is significant (p = 0.001) and explains 27.27%.

TP2

##Subset Timepoint 2 
Coral.log_TP2<-subset(Coral.log, TimeP=="TP2")

PERMANOVA

##PERMANOVA
Coral.TP2.perm<-adonis2(vegdist(Coral.log_TP2[,c(11:14, 16)], "euclidean")~ Coral.log_TP2$Origin * Coral.log_TP2$Site, data=Coral.log_TP2, strata=Coral.log_TP2$Genotype, method="euclidean")

##Effect Size
adonis_OmegaSq(Coral.TP2.perm)
Permutation test for adonis under reduced model
Terms added sequentially (first to last)
Blocks:  strata 
Permutation: free
Number of permutations: 999

adonis2(formula = vegdist(Coral.log_TP2[, c(11:14, 16)], "euclidean") ~ Coral.log_TP2$Origin * Coral.log_TP2$Site, data = Coral.log_TP2, method = "euclidean", strata = Coral.log_TP2$Genotype)
                                        Df SumOfSqs      F parOmegaSq Pr(>F)    
Coral.log_TP2$Origin                     1   0.0347  0.420   -0.01223  0.660    
Coral.log_TP2$Site                       1   2.0831 25.239    0.33554  0.001 ***
Coral.log_TP2$Origin:Coral.log_TP2$Site  1   0.2762  3.346    0.04660  0.050 *  
Residual                                44   3.6315                             
Total                                   47   6.0255                             
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
##Check dispersion by Origin
anova(betadisper(vegdist(Coral.log_TP2[,c(11:14, 16)], "euclidean"), Coral.log_TP2$Origin))
Analysis of Variance Table

Response: Distances
          Df  Sum Sq  Mean Sq F value Pr(>F)
Groups     1 0.02892 0.028918  1.1826 0.2825
Residuals 46 1.12482 0.024453               
##Check dispersion by Site
anova(betadisper(vegdist(Coral.log_TP2[,c(11:14, 16)], "euclidean"), Coral.log_TP2$Site))
Analysis of Variance Table

Response: Distances
          Df  Sum Sq   Mean Sq F value Pr(>F)
Groups     1 0.00701 0.0070126  0.5917 0.4457
Residuals 46 0.54518 0.0118518               
##Check dispersion by Origin:Site
anova(betadisper(vegdist(Coral.log_TP2[,c(11:14, 16)], "euclidean"), Coral.log_TP2$Origin:Coral.log_TP2$Site))
Analysis of Variance Table

Response: Distances
          Df  Sum Sq   Mean Sq F value Pr(>F)
Groups     3 0.02003 0.0066763  0.6202 0.6057
Residuals 44 0.47364 0.0107645               

Effect Size

Calculate Effect Size of Origin for each Site

##KL
##PERMANOVA
Coral.TP2.perm_KL<-adonis2(vegdist(Coral.log_TP2[which(Coral.log_TP2$Site=="KL"),c(11:14, 16)], "euclidean")~ Coral.log_TP2$Origin[which(Coral.log_TP2$Site=="KL")], data=Coral.log_TP2[which(Coral.log_TP2$Site=="KL"),], strata=Coral.log_TP2$Genotype[which(Coral.log_TP2$Site=="KL")], method="euclidean")

##Effect Size
adonis_OmegaSq(Coral.TP2.perm_KL)
Permutation test for adonis under reduced model
Terms added sequentially (first to last)
Blocks:  strata 
Permutation: free
Number of permutations: 999

adonis2(formula = vegdist(Coral.log_TP2[which(Coral.log_TP2$Site == "KL"), c(11:14, 16)], "euclidean") ~ Coral.log_TP2$Origin[which(Coral.log_TP2$Site == "KL")], data = Coral.log_TP2[which(Coral.log_TP2$Site == "KL"), ], method = "euclidean", strata = Coral.log_TP2$Genotype[which(Coral.log_TP2$Site == "KL")])
                                                        Df SumOfSqs      F parOmegaSq
Coral.log_TP2$Origin[which(Coral.log_TP2$Site == "KL")]  1  0.18146 2.5268   0.059813
Residual                                                22  1.57991                  
Total                                                   23  1.76137                  
                                                        Pr(>F)  
Coral.log_TP2$Origin[which(Coral.log_TP2$Site == "KL")]  0.045 *
Residual                                                        
Total                                                           
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
##Check dispersion by Origin
anova(betadisper(vegdist(Coral.log_TP2[which(Coral.log_TP2$Site=="KL"),c(11:14, 16)], "euclidean"), Coral.log_TP2$Origin[which(Coral.log_TP2$Site=="KL")]))
Analysis of Variance Table

Response: Distances
          Df   Sum Sq   Mean Sq F value Pr(>F)
Groups     1 0.000732 0.0007320  0.0896 0.7675
Residuals 22 0.179698 0.0081681               
##SS
##PERMANOVA
Coral.TP2.perm_SS<-adonis2(vegdist(Coral.log_TP2[which(Coral.log_TP2$Site=="SS"),c(11:14, 16)], "euclidean")~ Coral.log_TP2$Origin[which(Coral.log_TP2$Site=="SS")], data=Coral.log_TP2[which(Coral.log_TP2$Site=="SS"),], strata=Coral.log_TP2$Genotype[which(Coral.log_TP2$Site=="SS")], method="euclidean")

##Effect Size
adonis_OmegaSq(Coral.TP2.perm_SS)
Permutation test for adonis under reduced model
Terms added sequentially (first to last)
Blocks:  strata 
Permutation: free
Number of permutations: 999

adonis2(formula = vegdist(Coral.log_TP2[which(Coral.log_TP2$Site == "SS"), c(11:14, 16)], "euclidean") ~ Coral.log_TP2$Origin[which(Coral.log_TP2$Site == "SS")], data = Coral.log_TP2[which(Coral.log_TP2$Site == "SS"), ], method = "euclidean", strata = Coral.log_TP2$Genotype[which(Coral.log_TP2$Site == "SS")])
                                                        Df SumOfSqs      F parOmegaSq
Coral.log_TP2$Origin[which(Coral.log_TP2$Site == "SS")]  1  0.12937 1.3872   0.015878
Residual                                                22  2.05163                  
Total                                                   23  2.18100                  
                                                        Pr(>F)
Coral.log_TP2$Origin[which(Coral.log_TP2$Site == "SS")]  0.166
Residual                                                      
Total                                                         
##Check dispersion by Origin
anova(betadisper(vegdist(Coral.log_TP2[which(Coral.log_TP2$Site=="SS"),c(11:14, 16)], "euclidean"), Coral.log_TP2$Origin[which(Coral.log_TP2$Site=="SS")]))
Analysis of Variance Table

Response: Distances
          Df   Sum Sq   Mean Sq F value Pr(>F)
Groups     1 0.006276 0.0062764  0.4698 0.5003
Residuals 22 0.293942 0.0133610               

TP3

##Subset Timepoint 3 
Coral.log_TP3<-subset(Coral.log, TimeP=="TP3")

PERMANOVA

##PERMANOVA
Coral.TP3.perm<-adonis2(vegdist(Coral.log_TP3[,c(11:14, 16)], "euclidean")~ Coral.log_TP3$Origin * Coral.log_TP3$Site, data=Coral.log_TP3, strata=Coral.log_TP3$Genotype, method="euclidean")

##Effect Size
adonis_OmegaSq(Coral.TP3.perm)
Permutation test for adonis under reduced model
Terms added sequentially (first to last)
Blocks:  strata 
Permutation: free
Number of permutations: 999

adonis2(formula = vegdist(Coral.log_TP3[, c(11:14, 16)], "euclidean") ~ Coral.log_TP3$Origin * Coral.log_TP3$Site, data = Coral.log_TP3, method = "euclidean", strata = Coral.log_TP3$Genotype)
                                        Df SumOfSqs       F parOmegaSq Pr(>F)    
Coral.log_TP3$Origin                     1   0.1051  0.7853  -0.004493  0.361    
Coral.log_TP3$Site                       1   1.4021 10.4738   0.164837  0.001 ***
Coral.log_TP3$Origin:Coral.log_TP3$Site  1   0.1024  0.7649  -0.004921  0.378    
Residual                                44   5.8901                              
Total                                   47   7.4997                              
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
##Check dispersion by Origin
anova(betadisper(vegdist(Coral.log_TP3[,c(11:14, 16)], "euclidean"), Coral.log_TP3$Origin))
Analysis of Variance Table

Response: Distances
          Df  Sum Sq  Mean Sq F value Pr(>F)
Groups     1 0.06528 0.065278  2.0695  0.157
Residuals 46 1.45099 0.031543               
##Check dispersion by Site
anova(betadisper(vegdist(Coral.log_TP3[,c(11:14, 16)], "euclidean"), Coral.log_TP3$Site))
Analysis of Variance Table

Response: Distances
          Df  Sum Sq  Mean Sq F value Pr(>F)
Groups     1 0.00202 0.002024  0.0609 0.8062
Residuals 46 1.52934 0.033246               
##Check dispersion by Origin:Site
anova(betadisper(vegdist(Coral.log_TP3[,c(11:14, 16)], "euclidean"), Coral.log_TP3$Origin:Coral.log_TP3$Site))
Analysis of Variance Table

Response: Distances
          Df  Sum Sq  Mean Sq F value Pr(>F)
Groups     3 0.09225 0.030751   0.975 0.4131
Residuals 44 1.38769 0.031538               

Effect Size

Calculate Effect Size of Origin for each Site

##KL
##PERMANOVA
Coral.TP3.perm_KL<-adonis2(vegdist(Coral.log_TP3[which(Coral.log_TP3$Site=="KL"),c(11:14, 16)], "euclidean")~ Coral.log_TP3$Origin[which(Coral.log_TP3$Site=="KL")], data=Coral.log_TP3[which(Coral.log_TP3$Site=="KL"),], strata=Coral.log_TP3$Genotype[which(Coral.log_TP3$Site=="KL")], method="euclidean")

##Effect Size
adonis_OmegaSq(Coral.TP3.perm_KL)
Permutation test for adonis under reduced model
Terms added sequentially (first to last)
Blocks:  strata 
Permutation: free
Number of permutations: 999

adonis2(formula = vegdist(Coral.log_TP3[which(Coral.log_TP3$Site == "KL"), c(11:14, 16)], "euclidean") ~ Coral.log_TP3$Origin[which(Coral.log_TP3$Site == "KL")], data = Coral.log_TP3[which(Coral.log_TP3$Site == "KL"), ], method = "euclidean", strata = Coral.log_TP3$Genotype[which(Coral.log_TP3$Site == "KL")])
                                                        Df SumOfSqs      F parOmegaSq
Coral.log_TP3$Origin[which(Coral.log_TP3$Site == "KL")]  1  0.17515 1.5145   0.020987
Residual                                                22  2.54431                  
Total                                                   23  2.71946                  
                                                        Pr(>F)
Coral.log_TP3$Origin[which(Coral.log_TP3$Site == "KL")]  0.153
Residual                                                      
Total                                                         
##Check dispersion by Origin
anova(betadisper(vegdist(Coral.log_TP3[which(Coral.log_TP3$Site=="KL"),c(11:14, 16)], "euclidean"), Coral.log_TP3$Origin[which(Coral.log_TP3$Site=="KL")]))
Analysis of Variance Table

Response: Distances
          Df  Sum Sq   Mean Sq F value Pr(>F)
Groups     1 0.00703 0.0070337  0.3193 0.5778
Residuals 22 0.48467 0.0220307               
##SS
##PERMANOVA
Coral.TP3.perm_SS<-adonis2(vegdist(Coral.log_TP3[which(Coral.log_TP3$Site=="SS"),c(11:14, 16)], "euclidean")~ Coral.log_TP3$Origin[which(Coral.log_TP3$Site=="SS")], data=Coral.log_TP3[which(Coral.log_TP3$Site=="SS"),], strata=Coral.log_TP3$Genotype[which(Coral.log_TP3$Site=="SS")], method="euclidean")

##Effect Size
adonis_OmegaSq(Coral.TP3.perm_SS)
Permutation test for adonis under reduced model
Terms added sequentially (first to last)
Blocks:  strata 
Permutation: free
Number of permutations: 999

adonis2(formula = vegdist(Coral.log_TP3[which(Coral.log_TP3$Site == "SS"), c(11:14, 16)], "euclidean") ~ Coral.log_TP3$Origin[which(Coral.log_TP3$Site == "SS")], data = Coral.log_TP3[which(Coral.log_TP3$Site == "SS"), ], method = "euclidean", strata = Coral.log_TP3$Genotype[which(Coral.log_TP3$Site == "SS")])
                                                        Df SumOfSqs      F parOmegaSq
Coral.log_TP3$Origin[which(Coral.log_TP3$Site == "SS")]  1   0.0324 0.2129   -0.03391
Residual                                                22   3.3458                  
Total                                                   23   3.3782                  
                                                        Pr(>F)
Coral.log_TP3$Origin[which(Coral.log_TP3$Site == "SS")]  0.772
Residual                                                      
Total                                                         
##Check dispersion by Origin
anova(betadisper(vegdist(Coral.log_TP3[which(Coral.log_TP3$Site=="SS"),c(11:14, 16)], "euclidean"), Coral.log_TP3$Origin[which(Coral.log_TP3$Site=="SS")]))
Analysis of Variance Table

Response: Distances
          Df  Sum Sq  Mean Sq F value Pr(>F)
Groups     1 0.07949 0.079485  1.9365  0.178
Residuals 22 0.90301 0.041046               

TP4

##Subset Timepoint 4 
Coral.log_TP4<-subset(Coral.log, TimeP=="TP4")

PERMANOVA

##PERMANOVA
Coral.TP4.perm<-adonis2(vegdist(Coral.log_TP4[,c(11:14, 16)], "euclidean")~ Coral.log_TP4$Origin * Coral.log_TP4$Site, data=Coral.log_TP4, strata=Coral.log_TP4$Genotype, method="euclidean")

##Effect Size
adonis_OmegaSq(Coral.TP4.perm)
Permutation test for adonis under reduced model
Terms added sequentially (first to last)
Blocks:  strata 
Permutation: free
Number of permutations: 999

adonis2(formula = vegdist(Coral.log_TP4[, c(11:14, 16)], "euclidean") ~ Coral.log_TP4$Origin * Coral.log_TP4$Site, data = Coral.log_TP4, method = "euclidean", strata = Coral.log_TP4$Genotype)
                                        Df SumOfSqs       F parOmegaSq Pr(>F)    
Coral.log_TP4$Origin                     1   0.0204  0.1301  -0.019276  0.921    
Coral.log_TP4$Site                       1   2.5446 16.2273   0.248701  0.001 ***
Coral.log_TP4$Origin:Coral.log_TP4$Site  1   0.2287  1.4586   0.009870  0.214    
Residual                                42   6.5861                              
Total                                   45   9.3799                              
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
##Check dispersion by Origin
anova(betadisper(vegdist(Coral.log_TP4[,c(11:14, 16)], "euclidean"), Coral.log_TP4$Origin))
Analysis of Variance Table

Response: Distances
          Df  Sum Sq  Mean Sq F value Pr(>F)
Groups     1 0.00639 0.006388  0.1952 0.6608
Residuals 44 1.44022 0.032732               
##Check dispersion by Site
anova(betadisper(vegdist(Coral.log_TP4[,c(11:14, 16)], "euclidean"), Coral.log_TP4$Site))
Analysis of Variance Table

Response: Distances
          Df  Sum Sq  Mean Sq F value Pr(>F)
Groups     1 0.01153 0.011529  0.3704 0.5459
Residuals 44 1.36932 0.031121               
##Check dispersion by Origin:Site
anova(betadisper(vegdist(Coral.log_TP4[,c(11:14, 16)], "euclidean"), Coral.log_TP4$Origin:Coral.log_TP4$Site))
Analysis of Variance Table

Response: Distances
          Df  Sum Sq  Mean Sq F value Pr(>F)
Groups     3 0.04203 0.014012  0.4161 0.7423
Residuals 42 1.41428 0.033673               

Effect Size

Calculate Effect Size of Origin for each Site

##KL
##PERMANOVA
Coral.TP4.perm_KL<-adonis2(vegdist(Coral.log_TP4[which(Coral.log_TP4$Site=="KL"),c(11:14, 16)], "euclidean")~ Coral.log_TP4$Origin[which(Coral.log_TP4$Site=="KL")], data=Coral.log_TP4[which(Coral.log_TP4$Site=="KL"),], strata=Coral.log_TP4$Genotype[which(Coral.log_TP4$Site=="KL")], method="euclidean")

##Effect Size
adonis_OmegaSq(Coral.TP4.perm_KL)
Permutation test for adonis under reduced model
Terms added sequentially (first to last)
Blocks:  strata 
Permutation: free
Number of permutations: 999

adonis2(formula = vegdist(Coral.log_TP4[which(Coral.log_TP4$Site == "KL"), c(11:14, 16)], "euclidean") ~ Coral.log_TP4$Origin[which(Coral.log_TP4$Site == "KL")], data = Coral.log_TP4[which(Coral.log_TP4$Site == "KL"), ], method = "euclidean", strata = Coral.log_TP4$Genotype[which(Coral.log_TP4$Site == "KL")])
                                                        Df SumOfSqs      F parOmegaSq
Coral.log_TP4$Origin[which(Coral.log_TP4$Site == "KL")]  1   0.0676 0.3774  -0.027823
Residual                                                21   3.7601                  
Total                                                   22   3.8277                  
                                                        Pr(>F)
Coral.log_TP4$Origin[which(Coral.log_TP4$Site == "KL")]  0.676
Residual                                                      
Total                                                         
##Check dispersion by Origin
anova(betadisper(vegdist(Coral.log_TP4[which(Coral.log_TP4$Site=="KL"),c(11:14, 16)], "euclidean"), Coral.log_TP4$Origin[which(Coral.log_TP4$Site=="KL")]))
Analysis of Variance Table

Response: Distances
          Df  Sum Sq  Mean Sq F value Pr(>F)
Groups     1 0.00316 0.003160  0.0776 0.7833
Residuals 21 0.85503 0.040716               
##SS
##PERMANOVA
Coral.TP4.perm_SS<-adonis2(vegdist(Coral.log_TP4[which(Coral.log_TP4$Site=="SS"),c(11:14, 16)], "euclidean")~ Coral.log_TP4$Origin[which(Coral.log_TP4$Site=="SS")], data=Coral.log_TP4[which(Coral.log_TP4$Site=="SS"),], strata=Coral.log_TP4$Genotype[which(Coral.log_TP4$Site=="SS")], method="euclidean")

##Effect Size
adonis_OmegaSq(Coral.TP4.perm_SS)
Permutation test for adonis under reduced model
Terms added sequentially (first to last)
Blocks:  strata 
Permutation: free
Number of permutations: 999

adonis2(formula = vegdist(Coral.log_TP4[which(Coral.log_TP4$Site == "SS"), c(11:14, 16)], "euclidean") ~ Coral.log_TP4$Origin[which(Coral.log_TP4$Site == "SS")], data = Coral.log_TP4[which(Coral.log_TP4$Site == "SS"), ], method = "euclidean", strata = Coral.log_TP4$Genotype[which(Coral.log_TP4$Site == "SS")])
                                                        Df SumOfSqs     F parOmegaSq Pr(>F)
Coral.log_TP4$Origin[which(Coral.log_TP4$Site == "SS")]  1  0.18154 1.349   0.014948  0.149
Residual                                                21  2.82599                        
Total                                                   22  3.00753                        
##Check dispersion by Origin
anova(betadisper(vegdist(Coral.log_TP4[which(Coral.log_TP4$Site=="SS"),c(11:14, 16)], "euclidean"), Coral.log_TP4$Origin[which(Coral.log_TP4$Site=="SS")]))
Analysis of Variance Table

Response: Distances
          Df  Sum Sq  Mean Sq F value Pr(>F)
Groups     1 0.02157 0.021572    0.81 0.3783
Residuals 21 0.55925 0.026631               

Univariate

TP1

##Subset Timepoint 1 
Coral.TP1<-subset(Coral.rm, TimeP=="TP1")

Protein Host

##Check normality
hist(Coral.TP1$TP_ug.cm2_C)

shapiro.test(Coral.TP1$TP_ug.cm2_C)

    Shapiro-Wilk normality test

data:  Coral.TP1$TP_ug.cm2_C
W = 0.98637, p-value = 0.8448
#Normal

##Model 
#Function of Site and Origin, with Genotype as a Random effect
#Interactions between Origin and Site
Prot.C.lme_TP1<-lmer(TP_ug.cm2_C~Origin*Site+(1|Genotype), data=Coral.TP1)

##Check residuals
Prot.C.lme_res_TP1 <- simulateResiduals(fittedModel = Prot.C.lme_TP1, plot = F)
plot(Prot.C.lme_res_TP1)


##Model results
summary(Prot.C.lme_TP1)
Linear mixed model fit by REML ['lmerMod']
Formula: TP_ug.cm2_C ~ Origin * Site + (1 | Genotype)
   Data: Coral.TP1

REML criterion at convergence: 476.8

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-1.98711 -0.58176 -0.00143  0.76130  1.61635 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 1703     41.27   
 Residual             2107     45.91   
Number of obs: 48, groups:  Genotype, 3

Fixed effects:
                        Estimate Std. Error t value
(Intercept)              340.714     27.262  12.498
OriginTransplant           3.303     18.741   0.176
SiteSS                    55.261     18.741   2.949
OriginTransplant:SiteSS  -31.334     26.504  -1.182

Correlation of Fixed Effects:
            (Intr) OrgnTr SiteSS
OrgnTrnspln -0.344              
SiteSS      -0.344  0.500       
OrgnTrn:SSS  0.243 -0.707 -0.707
eta_squared(Prot.C.lme_TP1)
# Effect Size for ANOVA (Type III)

Parameter   | Eta2 (partial) |       95% CI
-------------------------------------------
Origin      |           0.02 | [0.00, 1.00]
Site        |           0.18 | [0.04, 1.00]
Origin:Site |           0.03 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].

Protein Symbiont

##Check normality
hist(Coral.TP1$TP_ug.cm2_S)

shapiro.test(Coral.TP1$TP_ug.cm2_S)

    Shapiro-Wilk normality test

data:  Coral.TP1$TP_ug.cm2_S
W = 0.96018, p-value = 0.1027
#Normal

##Model
#Function of Site and Origin, with Genotype as a Random effect
#Interactions between Origin and Site
Prot.S.lme_TP1<-lmer(TP_ug.cm2_S~Origin*Site+(1|Genotype), data=Coral.TP1)

##Check residuals
Prot.S.lme_res_TP1 <- simulateResiduals(fittedModel = Prot.S.lme_TP1, plot = F)
plot(Prot.S.lme_res_TP1)


##Model results
summary(Prot.S.lme_TP1)
Linear mixed model fit by REML ['lmerMod']
Formula: TP_ug.cm2_S ~ Origin * Site + (1 | Genotype)
   Data: Coral.TP1

REML criterion at convergence: 504.7

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-1.99771 -0.58981 -0.06134  0.48297  2.49136 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 1613     40.17   
 Residual             4087     63.93   
Number of obs: 48, groups:  Genotype, 3

Fixed effects:
                        Estimate Std. Error t value
(Intercept)              459.014     29.638  15.488
OriginTransplant           1.258     26.100   0.048
SiteSS                    42.145     26.100   1.615
OriginTransplant:SiteSS  -86.531     36.910  -2.344

Correlation of Fixed Effects:
            (Intr) OrgnTr SiteSS
OrgnTrnspln -0.440              
SiteSS      -0.440  0.500       
OrgnTrn:SSS  0.311 -0.707 -0.707
eta_squared(Prot.S.lme_TP1)
# Effect Size for ANOVA (Type III)

Parameter   | Eta2 (partial) |       95% CI
-------------------------------------------
Origin      |           0.11 | [0.01, 1.00]
Site        |       8.78e-05 | [0.00, 1.00]
Origin:Site |           0.12 | [0.01, 1.00]

- One-sided CIs: upper bound fixed at [1.00].

Effect size of Origin for each Site

##KL
Prot.S.lme_TP1_KL<-lmer(TP_ug.cm2_S~Origin+(1|Genotype), data=Coral.TP1[which(Coral.TP1$Site=="KL"),])
summary(Prot.S.lme_TP1_KL)
Linear mixed model fit by REML ['lmerMod']
Formula: TP_ug.cm2_S ~ Origin + (1 | Genotype)
   Data: Coral.TP1[which(Coral.TP1$Site == "KL"), ]

REML criterion at convergence: 254.6

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-1.64984 -0.68376 -0.07079  0.30913  2.31492 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 2602     51.01   
 Residual             4223     64.99   
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error t value
(Intercept)       459.014     34.918  13.145
OriginTransplant    1.258     26.531   0.047

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.380
eta_squared(Prot.S.lme_TP1_KL)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |       1.12e-04 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##SS
Prot.S.lme_TP1_SS<-lmer(TP_ug.cm2_S~Origin+(1|Genotype), data=Coral.TP1[which(Coral.TP1$Site=="SS"),])
summary(Prot.S.lme_TP1_SS)
Linear mixed model fit by REML ['lmerMod']
Formula: TP_ug.cm2_S ~ Origin + (1 | Genotype)
   Data: Coral.TP1[which(Coral.TP1$Site == "SS"), ]

REML criterion at convergence: 251.1

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.7405 -0.5819 -0.2580  0.6750  2.1154 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept)  695.5   26.37   
 Residual             3899.6   62.45   
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error t value
(Intercept)        501.16      23.60  21.239
OriginTransplant   -85.27      25.49  -3.345

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.540
eta_squared(Prot.S.lme_TP1_SS)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |           0.36 | [0.10, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##Summary statistics by Site and Origin
TP1_ProtSym.sum<-summarySE(Coral.TP1, measurevar="TP_ug.cm2_S", groupvars=c("Site", "Origin", "Site.Orig"), na.rm=TRUE)

##Plot Average Symbiont Protein across Treatments
TP1_ProtSym.plot<-ggplot(TP1_ProtSym.sum, aes(x=Site, y=TP_ug.cm2_S, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=TP_ug.cm2_S-se, ymax=TP_ug.cm2_S+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
  labs(x="Site and Origin", y=expression(paste('Symbiont Protein (\u03BCg cm'^-2*")")), colour="Origin")+
  ylim(350, 550)+
  annotate("text", x=2, y=535, label="**", size=sig.sz, fontface="bold"); TP1_ProtSym.plot

Biomass Host

##Check normality
hist(Coral.TP1$AFDW_mg.cm2_C)

shapiro.test(Coral.TP1$AFDW_mg.cm2_C)

    Shapiro-Wilk normality test

data:  Coral.TP1$AFDW_mg.cm2_C
W = 0.96547, p-value = 0.1677
#Normal

##Model
#Function of Site and Origin, with Genotype as a Random effect
#Interactions between Origin and Site
Bio.C.lme_TP1<-lmer(AFDW_mg.cm2_C~Origin*Site+(1|Genotype), data=Coral.TP1)

##Check residuals
Bio.C.lme_res_TP1 <- simulateResiduals(fittedModel = Bio.C.lme_TP1, plot = F)
plot(Bio.C.lme_res_TP1)


##Model results
summary(Bio.C.lme_TP1)
Linear mixed model fit by REML ['lmerMod']
Formula: AFDW_mg.cm2_C ~ Origin * Site + (1 | Genotype)
   Data: Coral.TP1

REML criterion at convergence: 17.9

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.3616 -0.6323  0.1012  0.6827  1.4522 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.006352 0.0797  
 Residual             0.067274 0.2594  
Number of obs: 48, groups:  Genotype, 3

Fixed effects:
                        Estimate Std. Error t value
(Intercept)              1.20320    0.08788  13.691
OriginTransplant        -0.18538    0.10589  -1.751
SiteSS                  -0.01392    0.10589  -0.131
OriginTransplant:SiteSS  0.04772    0.14975   0.319

Correlation of Fixed Effects:
            (Intr) OrgnTr SiteSS
OrgnTrnspln -0.602              
SiteSS      -0.602  0.500       
OrgnTrn:SSS  0.426 -0.707 -0.707
eta_squared(Bio.C.lme_TP1)
# Effect Size for ANOVA (Type III)

Parameter   | Eta2 (partial) |       95% CI
-------------------------------------------
Origin      |           0.10 | [0.00, 1.00]
Site        |       4.20e-04 | [0.00, 1.00]
Origin:Site |       2.41e-03 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].

Effect size of Origin for each Site

##KL
Bio.C.lme_TP1_KL<-lmer(AFDW_mg.cm2_C~Origin+(1|Genotype), data=Coral.TP1[which(Coral.TP1$Site=="KL"),])
summary(Bio.C.lme_TP1_KL)
Linear mixed model fit by REML ['lmerMod']
Formula: AFDW_mg.cm2_C ~ Origin + (1 | Genotype)
   Data: Coral.TP1[which(Coral.TP1$Site == "KL"), ]

REML criterion at convergence: 1.1

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-1.61169 -0.43907  0.07185  0.60072  1.71208 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.003322 0.05764 
 Residual             0.047206 0.21727 
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error t value
(Intercept)        1.2032     0.0710   16.95
OriginTransplant  -0.1854     0.0887   -2.09

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.625
eta_squared(Bio.C.lme_TP1_KL)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |           0.18 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##SS
Bio.C.lme_TP1_SS<-lmer(AFDW_mg.cm2_C~Origin+(1|Genotype), data=Coral.TP1[which(Coral.TP1$Site=="SS"),])
summary(Bio.C.lme_TP1_SS)
Linear mixed model fit by REML ['lmerMod']
Formula: AFDW_mg.cm2_C ~ Origin + (1 | Genotype)
   Data: Coral.TP1[which(Coral.TP1$Site == "SS"), ]

REML criterion at convergence: 15.4

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.9881 -0.5903  0.3895  0.6868  1.3845 

Random effects:
 Groups   Name        Variance  Std.Dev.
 Genotype (Intercept) 0.0002328 0.01526 
 Residual             0.0939949 0.30659 
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error t value
(Intercept)       1.18928    0.08894   13.37
OriginTransplant -0.13767    0.12516   -1.10

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.704
eta_squared(Bio.C.lme_TP1_SS)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |           0.06 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##Summary statistics by Site and Origin
TP1_BioHost.sum<-summarySE(Coral.TP1, measurevar="AFDW_mg.cm2_C", groupvars=c("Site", "Origin", "Site.Orig"), na.rm=TRUE)

##Plot Average Host Biomass across Treatments
TP1_BioHost.plot<-ggplot(TP1_BioHost.sum, aes(x=Site, y=AFDW_mg.cm2_C, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=AFDW_mg.cm2_C-se, ymax=AFDW_mg.cm2_C+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
  labs(x="Site and Origin", y=expression(paste('Host Biomass (mg cm'^-2*")")), colour="Origin")+
  ylim(0, 2)+
   annotate("text", x=1, y=1.5, label="*", size=sig.sz, fontface="bold"); TP1_BioHost.plot

Biomass Symbionts

##Check normality
hist(Coral.TP1$AFDW_mg.cm2_S)

shapiro.test(Coral.TP1$AFDW_mg.cm2_S)

    Shapiro-Wilk normality test

data:  Coral.TP1$AFDW_mg.cm2_S
W = 0.97584, p-value = 0.4194
#Normal

##Model 
#Function of Site and Origin, with Genotype as a Random effect
#Interactions between Origin and Site
Bio.S.lme_TP1<-lmer(AFDW_mg.cm2_S~Origin*Site+(1|Genotype), data=Coral.TP1)

##Check residuals
Bio.S.lme_res_TP1 <- simulateResiduals(fittedModel = Bio.S.lme_TP1, plot = F)
plot(Bio.S.lme_res_TP1)


##Model results
summary(Bio.S.lme_TP1)
Linear mixed model fit by REML ['lmerMod']
Formula: AFDW_mg.cm2_S ~ Origin * Site + (1 | Genotype)
   Data: Coral.TP1

REML criterion at convergence: -29.6

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-1.71364 -0.74817 -0.06341  0.60227  2.13813 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.002785 0.05277 
 Residual             0.022713 0.15071 
Number of obs: 48, groups:  Genotype, 3

Fixed effects:
                        Estimate Std. Error t value
(Intercept)              0.57323    0.05311  10.792
OriginTransplant         0.01058    0.06153   0.172
SiteSS                   0.16334    0.06153   2.655
OriginTransplant:SiteSS -0.22488    0.08701  -2.584

Correlation of Fixed Effects:
            (Intr) OrgnTr SiteSS
OrgnTrnspln -0.579              
SiteSS      -0.579  0.500       
OrgnTrn:SSS  0.410 -0.707 -0.707
eta_squared(Bio.S.lme_TP1)
# Effect Size for ANOVA (Type III)

Parameter   | Eta2 (partial) |       95% CI
-------------------------------------------
Origin      |           0.12 | [0.01, 1.00]
Site        |           0.03 | [0.00, 1.00]
Origin:Site |           0.14 | [0.02, 1.00]

- One-sided CIs: upper bound fixed at [1.00].

Effect size of Origin for each Site

##KL
Bio.S.lme_TP1_KL<-lmer(AFDW_mg.cm2_S~Origin+(1|Genotype), data=Coral.TP1[which(Coral.TP1$Site=="KL"),])
summary(Bio.S.lme_TP1_KL)
Linear mixed model fit by REML ['lmerMod']
Formula: AFDW_mg.cm2_S ~ Origin + (1 | Genotype)
   Data: Coral.TP1[which(Coral.TP1$Site == "KL"), ]

REML criterion at convergence: -21.1

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-1.72868 -0.71431  0.04303  0.52737  1.90341 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.01040  0.1020  
 Residual             0.01508  0.1228  
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error t value
(Intercept)       0.57323    0.06873   8.340
OriginTransplant  0.01058    0.05014   0.211

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.365
eta_squared(Bio.S.lme_TP1_KL)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |       2.22e-03 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##SS
Bio.S.lme_TP1_SS<-lmer(AFDW_mg.cm2_S~Origin+(1|Genotype), data=Coral.TP1[which(Coral.TP1$Site=="SS"),])
summary(Bio.S.lme_TP1_SS)
Linear mixed model fit by REML ['lmerMod']
Formula: AFDW_mg.cm2_S ~ Origin + (1 | Genotype)
   Data: Coral.TP1[which(Coral.TP1$Site == "SS"), ]

REML criterion at convergence: -13.1

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.2456 -0.7860 -0.1378  0.6402  2.1806 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.004289 0.06549 
 Residual             0.023707 0.15397 
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error t value
(Intercept)       0.73657    0.05836  12.622
OriginTransplant -0.21429    0.06286  -3.409

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.539
eta_squared(Bio.S.lme_TP1_SS)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |           0.37 | [0.10, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##Summary statistics by Site and Origin
TP1_BioSym.sum<-summarySE(Coral.TP1, measurevar="AFDW_mg.cm2_S", groupvars=c("Site", "Origin", "Site.Orig"), na.rm=TRUE)

##Plot Average Symbiont Biomass across Treatments
TP1_BioSym.plot<-ggplot(TP1_BioSym.sum, aes(x=Site, y=AFDW_mg.cm2_S, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=AFDW_mg.cm2_S-se, ymax=AFDW_mg.cm2_S+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
  labs(x="Site and Origin", y=expression(paste('Symbiont Biomass (mg cm'^-2*")")), colour="Origin")+
  ylim(0, 1)+
  annotate("text", x=2, y=0.85, label="**", size=sig.sz, fontface="bold"); TP1_BioSym.plot

Chlorophyll

##Check normality
hist(Coral.TP1$Chl_ug.cm2)

shapiro.test(Coral.TP1$Chl_ug.cm2)

    Shapiro-Wilk normality test

data:  Coral.TP1$Chl_ug.cm2
W = 0.95564, p-value = 0.06727
#Normal

##Model
#Function of Site and Origin, with Genotype as a Random effect
#Interactions between Origin and Site
Chl.lme_TP1<-lmer(Chl_ug.cm2~Origin*Site+(1|Genotype), data=Coral.TP1)

##Check residuals
Chl.lme_res_TP1 <- simulateResiduals(fittedModel = Chl.lme_TP1, plot = F)
plot(Chl.lme_res_TP1)


##Model results
summary(Chl.lme_TP1)
Linear mixed model fit by REML ['lmerMod']
Formula: Chl_ug.cm2 ~ Origin * Site + (1 | Genotype)
   Data: Coral.TP1

REML criterion at convergence: -0.4

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.1377 -0.5871 -0.1548  0.6976  2.0162 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.08669  0.2944  
 Residual             0.03936  0.1984  
Number of obs: 48, groups:  Genotype, 3

Fixed effects:
                        Estimate Std. Error t value
(Intercept)              0.86074    0.17937   4.799
OriginTransplant         0.07568    0.08099   0.934
SiteSS                   0.54382    0.08099   6.715
OriginTransplant:SiteSS -0.48115    0.11454  -4.201

Correlation of Fixed Effects:
            (Intr) OrgnTr SiteSS
OrgnTrnspln -0.226              
SiteSS      -0.226  0.500       
OrgnTrn:SSS  0.160 -0.707 -0.707
eta_squared(Chl.lme_TP1)
# Effect Size for ANOVA (Type III)

Parameter   | Eta2 (partial) |       95% CI
-------------------------------------------
Origin      |           0.16 | [0.03, 1.00]
Site        |           0.40 | [0.21, 1.00]
Origin:Site |           0.30 | [0.12, 1.00]

- One-sided CIs: upper bound fixed at [1.00].

Effect size of Origin for each Site

##KL
Chl.lme_TP1_KL<-lmer(Chl_ug.cm2~Origin+(1|Genotype), data=Coral.TP1[which(Coral.TP1$Site=="KL"),])
summary(Chl.lme_TP1_KL)
Linear mixed model fit by REML ['lmerMod']
Formula: Chl_ug.cm2 ~ Origin + (1 | Genotype)
   Data: Coral.TP1[which(Coral.TP1$Site == "KL"), ]

REML criterion at convergence: -4.9

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-1.42282 -0.68856  0.00126  0.53926  2.32168 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.05037  0.2244  
 Residual             0.02931  0.1712  
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error t value
(Intercept)       0.86074    0.13868   6.207
OriginTransplant  0.07568    0.06989   1.083

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.252
eta_squared(Chl.lme_TP1_KL)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |           0.06 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##SS
Chl.lme_TP1_SS<-lmer(Chl_ug.cm2~Origin+(1|Genotype), data=Coral.TP1[which(Coral.TP1$Site=="SS"),])
summary(Chl.lme_TP1_SS)
Linear mixed model fit by REML ['lmerMod']
Formula: Chl_ug.cm2 ~ Origin + (1 | Genotype)
   Data: Coral.TP1[which(Coral.TP1$Site == "SS"), ]

REML criterion at convergence: 2.6

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.0949 -0.5799  0.1160  0.6297  1.7750 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.13767  0.3710  
 Residual             0.03874  0.1968  
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error t value
(Intercept)       1.40456    0.22163   6.338
OriginTransplant -0.40548    0.08035  -5.046

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.181
eta_squared(Chl.lme_TP1_SS)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |           0.56 | [0.30, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##Summary statistics by Site and Origin
TP1_Chl.sum<-summarySE(Coral.TP1, measurevar="Chl_ug.cm2", groupvars=c("Site", "Origin", "Site.Orig"), na.rm=TRUE)

##Plot Average Chlorophyll across Treatments
TP1_Chl.plot<-ggplot(TP1_Chl.sum, aes(x=Site, y=Chl_ug.cm2, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=Chl_ug.cm2-se, ymax=Chl_ug.cm2+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
  labs(x="Site and Origin", y=expression(paste('Total Chlorophyll (\u03BCg cm'^-2*")")), colour="Origin")+
  ylim(0, 2)+
  annotate("text", x=2, y=1.7, label="***", size=sig.sz, fontface="bold"); TP1_Chl.plot

TP2

##Subset Timepoint 2 
Coral.TP2<-subset(Coral.rm, TimeP=="TP2")

Protein Host

##Check normality
hist(Coral.TP2$TP_ug.cm2_C)

shapiro.test(Coral.TP2$TP_ug.cm2_C)

    Shapiro-Wilk normality test

data:  Coral.TP2$TP_ug.cm2_C
W = 0.9796, p-value = 0.562
#Normal

##Model 
#Function of Site and Origin, with Genotype as a Random effect
#Interactions between Origin and Site
Prot.C.lme_TP2<-lmer(TP_ug.cm2_C~Origin*Site+(1|Genotype), data=Coral.TP2)

##Check residuals
Prot.C.lme_res_TP2 <- simulateResiduals(fittedModel = Prot.C.lme_TP2, plot = F)
plot(Prot.C.lme_res_TP2)


##Model results
summary(Prot.C.lme_TP2)
Linear mixed model fit by REML ['lmerMod']
Formula: TP_ug.cm2_C ~ Origin * Site + (1 | Genotype)
   Data: Coral.TP2

REML criterion at convergence: 469.4

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.67310 -0.67673 -0.00324  0.57592  1.67096 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept)  391.9   19.80   
 Residual             1877.0   43.32   
Number of obs: 48, groups:  Genotype, 3

Fixed effects:
                        Estimate Std. Error t value
(Intercept)              315.853     16.942  18.643
OriginTransplant          -1.965     17.687  -0.111
SiteSS                    42.263     17.687   2.389
OriginTransplant:SiteSS    8.579     25.013   0.343

Correlation of Fixed Effects:
            (Intr) OrgnTr SiteSS
OrgnTrnspln -0.522              
SiteSS      -0.522  0.500       
OrgnTrn:SSS  0.369 -0.707 -0.707
eta_squared(Prot.C.lme_TP2)
# Effect Size for ANOVA (Type III)

Parameter   | Eta2 (partial) |       95% CI
-------------------------------------------
Origin      |       8.22e-04 | [0.00, 1.00]
Site        |           0.25 | [0.08, 1.00]
Origin:Site |       2.79e-03 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].

Protein Symbiont

##Check normality
hist(Coral.TP2$TP_ug.cm2_S)

shapiro.test(Coral.TP2$TP_ug.cm2_S)

    Shapiro-Wilk normality test

data:  Coral.TP2$TP_ug.cm2_S
W = 0.95982, p-value = 0.09929
#Normal

##Model
#Function of Site and Origin, with Genotype as a Random effect
#Interactions between Origin and Site
Prot.S.lme_TP2<-lmer(TP_ug.cm2_S~Origin*Site+(1|Genotype), data=Coral.TP2)

##Check residuals
Prot.S.lme_res_TP2 <- simulateResiduals(fittedModel = Prot.S.lme_TP2, plot = F)
plot(Prot.S.lme_res_TP2)


##Model results
summary(Prot.S.lme_TP2)
Linear mixed model fit by REML ['lmerMod']
Formula: TP_ug.cm2_S ~ Origin * Site + (1 | Genotype)
   Data: Coral.TP2

REML criterion at convergence: 493.1

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.5114 -0.6809 -0.1247  0.6145  2.6570 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept)  796.1   28.22   
 Residual             3198.1   56.55   
Number of obs: 48, groups:  Genotype, 3

Fixed effects:
                        Estimate Std. Error t value
(Intercept)               329.07      23.06  14.269
OriginTransplant          -29.47      23.09  -1.277
SiteSS                     43.25      23.09   1.873
OriginTransplant:SiteSS    35.17      32.65   1.077

Correlation of Fixed Effects:
            (Intr) OrgnTr SiteSS
OrgnTrnspln -0.501              
SiteSS      -0.501  0.500       
OrgnTrn:SSS  0.354 -0.707 -0.707
eta_squared(Prot.S.lme_TP2)
# Effect Size for ANOVA (Type III)

Parameter   | Eta2 (partial) |       95% CI
-------------------------------------------
Origin      |           0.01 | [0.00, 1.00]
Site        |           0.25 | [0.08, 1.00]
Origin:Site |           0.03 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].

Effect size of Origin for each Site

##KL
Prot.S.lme_TP2_KL<-lmer(TP_ug.cm2_S~Origin+(1|Genotype), data=Coral.TP2[which(Coral.TP2$Site=="KL"),])
summary(Prot.S.lme_TP2_KL)
Linear mixed model fit by REML ['lmerMod']
Formula: TP_ug.cm2_S ~ Origin + (1 | Genotype)
   Data: Coral.TP2[which(Coral.TP2$Site == "KL"), ]

REML criterion at convergence: 238.6

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.4406 -0.8006  0.2111  0.5424  1.7322 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept)  688.7   26.24   
 Residual             2134.1   46.20   
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error t value
(Intercept)        329.07      20.18  16.303
OriginTransplant   -29.47      18.86  -1.563

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.467
eta_squared(Prot.S.lme_TP2_KL)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |           0.11 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##SS
Prot.S.lme_TP2_SS<-lmer(TP_ug.cm2_S~Origin+(1|Genotype), data=Coral.TP2[which(Coral.TP2$Site=="SS"),])
summary(Prot.S.lme_TP2_SS)
Linear mixed model fit by REML ['lmerMod']
Formula: TP_ug.cm2_S ~ Origin + (1 | Genotype)
   Data: Coral.TP2[which(Coral.TP2$Site == "SS"), ]

REML criterion at convergence: 251.8

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.3034 -0.8616  0.0128  0.6244  2.1515 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 1484     38.53   
 Residual             3840     61.96   
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error t value
(Intercept)       372.313     28.545  13.043
OriginTransplant    5.698     25.297   0.225

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.443
eta_squared(Prot.S.lme_TP2_SS)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |       2.53e-03 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##Summary statistics by Site and Origin
TP2_ProtSym.sum<-summarySE(Coral.TP2, measurevar="TP_ug.cm2_S", groupvars=c("Site", "Origin", "Site.Orig"), na.rm=TRUE)

##Plot Average Symbiont Protein across Treatments
TP2_ProtSym.plot<-ggplot(TP2_ProtSym.sum, aes(x=Site, y=TP_ug.cm2_S, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=TP_ug.cm2_S-se, ymax=TP_ug.cm2_S+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
  labs(x="Site and Origin", y=expression(paste('Symbiont Protein (\u03BCg cm'^-2*")")), colour="Origin")+
  ylim(250, 450); TP2_ProtSym.plot

Biomass Host

##Check normality
hist(Coral.TP2$AFDW_mg.cm2_C)

shapiro.test(Coral.TP2$AFDW_mg.cm2_C)

    Shapiro-Wilk normality test

data:  Coral.TP2$AFDW_mg.cm2_C
W = 0.98545, p-value = 0.8093
#Normal

##Model
#Function of Site and Origin, with Genotype as a Random effect
#Interactions between Origin and Site
Bio.C.lme_TP2<-lmer(AFDW_mg.cm2_C~Origin*Site+(1|Genotype), data=Coral.TP2)

##Check residuals
Bio.C.lme_res_TP2 <- simulateResiduals(fittedModel = Bio.C.lme_TP2, plot = F)
plot(Bio.C.lme_res_TP2)


##Model results
summary(Bio.C.lme_TP2)
Linear mixed model fit by REML ['lmerMod']
Formula: AFDW_mg.cm2_C ~ Origin * Site + (1 | Genotype)
   Data: Coral.TP2

REML criterion at convergence: -19.7

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.2645 -0.4732 -0.0846  0.5858  2.5448 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.002429 0.04928 
 Residual             0.028719 0.16947 
Number of obs: 48, groups:  Genotype, 3

Fixed effects:
                        Estimate Std. Error t value
(Intercept)              1.16312    0.05659  20.552
OriginTransplant        -0.10184    0.06918  -1.472
SiteSS                  -0.11111    0.06918  -1.606
OriginTransplant:SiteSS  0.26062    0.09784   2.664

Correlation of Fixed Effects:
            (Intr) OrgnTr SiteSS
OrgnTrnspln -0.611              
SiteSS      -0.611  0.500       
OrgnTrn:SSS  0.432 -0.707 -0.707
eta_squared(Bio.C.lme_TP2)
# Effect Size for ANOVA (Type III)

Parameter   | Eta2 (partial) |       95% CI
-------------------------------------------
Origin      |       8.00e-03 | [0.00, 1.00]
Site        |       3.65e-03 | [0.00, 1.00]
Origin:Site |           0.14 | [0.02, 1.00]

- One-sided CIs: upper bound fixed at [1.00].

Effect size of Origin for each Site

##KL
Bio.C.lme_TP2_KL<-lmer(AFDW_mg.cm2_C~Origin+(1|Genotype), data=Coral.TP2[which(Coral.TP2$Site=="KL"),])
summary(Bio.C.lme_TP2_KL)
Linear mixed model fit by REML ['lmerMod']
Formula: AFDW_mg.cm2_C ~ Origin + (1 | Genotype)
   Data: Coral.TP2[which(Coral.TP2$Site == "KL"), ]

REML criterion at convergence: -14.2

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.7100 -0.5598 -0.2566  0.3597  2.9272 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.001355 0.03681 
 Residual             0.023645 0.15377 
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error t value
(Intercept)       1.16312    0.04921  23.634
OriginTransplant -0.10184    0.06278  -1.622

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.638
eta_squared(Bio.C.lme_TP2_KL)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |           0.12 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##SS
Bio.C.lme_TP2_SS<-lmer(AFDW_mg.cm2_C~Origin+(1|Genotype), data=Coral.TP2[which(Coral.TP2$Site=="SS"),])
boundary (singular) fit: see help('isSingular')
summary(Bio.C.lme_TP2_SS)
Linear mixed model fit by REML ['lmerMod']
Formula: AFDW_mg.cm2_C ~ Origin + (1 | Genotype)
   Data: Coral.TP2[which(Coral.TP2$Site == "SS"), ]

REML criterion at convergence: -5.5

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.0676 -0.4964  0.1545  0.7280  1.2050 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.00000  0.0000  
 Residual             0.03634  0.1906  
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error t value
(Intercept)       1.05201    0.05503   19.12
OriginTransplant  0.15878    0.07783    2.04

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.707
optimizer (nloptwrap) convergence code: 0 (OK)
boundary (singular) fit: see help('isSingular')
eta_squared(Bio.C.lme_TP2_SS)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |           0.16 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##Summary statistics by Site and Origin
TP2_BioHost.sum<-summarySE(Coral.TP2, measurevar="AFDW_mg.cm2_C", groupvars=c("Site", "Origin", "Site.Orig"), na.rm=TRUE)

##Plot Average Host Biomass across Treatments
TP2_BioHost.plot<-ggplot(TP2_BioHost.sum, aes(x=Site, y=AFDW_mg.cm2_C, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=AFDW_mg.cm2_C-se, ymax=AFDW_mg.cm2_C+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
  labs(x="Site and Origin", y=expression(paste('Host Biomass (mg cm'^-2*")")), colour="Origin")+
  ylim(0, 2)+
  annotate("text", x=2, y=1.35, label="-", size=levels.sz, fontface="bold"); TP2_BioHost.plot

Biomass Symbionts

##Check normality
hist(Coral.TP2$AFDW_mg.cm2_S)

shapiro.test(Coral.TP2$AFDW_mg.cm2_S)

    Shapiro-Wilk normality test

data:  Coral.TP2$AFDW_mg.cm2_S
W = 0.98263, p-value = 0.6911
#Normal

##Model 
#Function of Site and Origin, with Genotype as a Random effect
#Interactions between Origin and Site
Bio.S.lme_TP2<-lmer(AFDW_mg.cm2_S~Origin*Site+(1|Genotype), data=Coral.TP2)

##Check residuals
Bio.S.lme_res_TP2 <- simulateResiduals(fittedModel = Bio.S.lme_TP2, plot = F)
plot(Bio.S.lme_res_TP2)


##Model results
summary(Bio.S.lme_TP2)
Linear mixed model fit by REML ['lmerMod']
Formula: AFDW_mg.cm2_S ~ Origin * Site + (1 | Genotype)
   Data: Coral.TP2

REML criterion at convergence: -50.2

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-1.89274 -0.61267 -0.05248  0.62439  1.64962 

Random effects:
 Groups   Name        Variance  Std.Dev.
 Genotype (Intercept) 0.0003874 0.01968 
 Residual             0.0146825 0.12117 
Number of obs: 48, groups:  Genotype, 3

Fixed effects:
                        Estimate Std. Error t value
(Intercept)              0.71562    0.03678  19.457
OriginTransplant        -0.12045    0.04947  -2.435
SiteSS                   0.12854    0.04947   2.599
OriginTransplant:SiteSS  0.11020    0.06996   1.575

Correlation of Fixed Effects:
            (Intr) OrgnTr SiteSS
OrgnTrnspln -0.673              
SiteSS      -0.673  0.500       
OrgnTrn:SSS  0.476 -0.707 -0.707
eta_squared(Bio.S.lme_TP2)
# Effect Size for ANOVA (Type III)

Parameter   | Eta2 (partial) |       95% CI
-------------------------------------------
Origin      |           0.08 | [0.00, 1.00]
Site        |           0.40 | [0.21, 1.00]
Origin:Site |           0.06 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].

Effect size of Origin for each Site

##KL
Bio.S.lme_TP2_KL<-lmer(AFDW_mg.cm2_S~Origin+(1|Genotype), data=Coral.TP2[which(Coral.TP2$Site=="KL"),])
boundary (singular) fit: see help('isSingular')
summary(Bio.S.lme_TP2_KL)
Linear mixed model fit by REML ['lmerMod']
Formula: AFDW_mg.cm2_S ~ Origin + (1 | Genotype)
   Data: Coral.TP2[which(Coral.TP2$Site == "KL"), ]

REML criterion at convergence: -25.2

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.7872 -0.5807 -0.0580  0.6095  1.5698 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.00000  0.0000  
 Residual             0.01486  0.1219  
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error t value
(Intercept)       0.71562    0.03519   20.34
OriginTransplant -0.12045    0.04977   -2.42

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.707
optimizer (nloptwrap) convergence code: 0 (OK)
boundary (singular) fit: see help('isSingular')
eta_squared(Bio.S.lme_TP2_KL)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |           0.21 | [0.02, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##SS
Bio.S.lme_TP2_SS<-lmer(AFDW_mg.cm2_S~Origin+(1|Genotype), data=Coral.TP2[which(Coral.TP2$Site=="SS"),])
summary(Bio.S.lme_TP2_SS)
Linear mixed model fit by REML ['lmerMod']
Formula: AFDW_mg.cm2_S ~ Origin + (1 | Genotype)
   Data: Coral.TP2[which(Coral.TP2$Site == "SS"), ]

REML criterion at convergence: -27.9

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.7098 -0.5388 -0.1840  0.6014  1.8524 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.004978 0.07056 
 Residual             0.011447 0.10699 
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error t value
(Intercept)       0.84416    0.05112  16.513
OriginTransplant -0.01025    0.04368  -0.235

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.427
eta_squared(Bio.S.lme_TP2_SS)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |       2.74e-03 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##Summary statistics by Site and Origin
TP2_BioSym.sum<-summarySE(Coral.TP2, measurevar="AFDW_mg.cm2_S", groupvars=c("Site", "Origin", "Site.Orig"), na.rm=TRUE)

##Plot Average Symbiont Biomass across Treatments
TP2_BioSym.plot<-ggplot(TP2_BioSym.sum, aes(x=Site, y=AFDW_mg.cm2_S, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=AFDW_mg.cm2_S-se, ymax=AFDW_mg.cm2_S+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
  labs(x="Site and Origin", y=expression(paste('Symbiont Biomass (mg cm'^-2*")")), colour="Origin")+
  ylim(0, 1)+
  annotate("text", x=1, y=0.85, label="*", size=sig.sz, fontface="bold"); TP2_BioSym.plot

Chlorophyll

##Check normality
hist(Coral.TP2$Chl_ug.cm2)

shapiro.test(Coral.TP2$Chl_ug.cm2)

    Shapiro-Wilk normality test

data:  Coral.TP2$Chl_ug.cm2
W = 0.89322, p-value = 0.0003826
#Normal

##Model
#Function of Site and Origin, with Genotype as a Random effect
#Interactions between Origin and Site
Chl.lme_TP2<-lmer(Chl_ug.cm2~Origin*Site+(1|Genotype), data=Coral.TP2)

##Check residuals
Chl.lme_res_TP2 <- simulateResiduals(fittedModel = Chl.lme_TP2, plot = F)
plot(Chl.lme_res_TP2)


##Model results
summary(Chl.lme_TP2)
Linear mixed model fit by REML ['lmerMod']
Formula: Chl_ug.cm2 ~ Origin * Site + (1 | Genotype)
   Data: Coral.TP2

REML criterion at convergence: 60.1

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.5646 -0.6834 -0.2260  0.6331  2.9227 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.02999  0.1732  
 Residual             0.17246  0.4153  
Number of obs: 48, groups:  Genotype, 3

Fixed effects:
                        Estimate Std. Error t value
(Intercept)               1.2824     0.1561   8.216
OriginTransplant         -0.2475     0.1695  -1.460
SiteSS                    0.5567     0.1695   3.284
OriginTransplant:SiteSS   0.6593     0.2398   2.750

Correlation of Fixed Effects:
            (Intr) OrgnTr SiteSS
OrgnTrnspln -0.543              
SiteSS      -0.543  0.500       
OrgnTrn:SSS  0.384 -0.707 -0.707
eta_squared(Chl.lme_TP2)
# Effect Size for ANOVA (Type III)

Parameter   | Eta2 (partial) |       95% CI
-------------------------------------------
Origin      |           0.01 | [0.00, 1.00]
Site        |           0.57 | [0.40, 1.00]
Origin:Site |           0.15 | [0.02, 1.00]

- One-sided CIs: upper bound fixed at [1.00].

Effect size of Origin for each Site

##KL
Chl.lme_TP2_KL<-lmer(Chl_ug.cm2~Origin+(1|Genotype), data=Coral.TP2[which(Coral.TP2$Site=="KL"),])
summary(Chl.lme_TP2_KL)
Linear mixed model fit by REML ['lmerMod']
Formula: Chl_ug.cm2 ~ Origin + (1 | Genotype)
   Data: Coral.TP2[which(Coral.TP2$Site == "KL"), ]

REML criterion at convergence: 4.9

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.4118 -0.7633 -0.1784  0.6717  2.0082 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.01088  0.1043  
 Residual             0.05353  0.2314  
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error t value
(Intercept)       1.28244    0.08993   14.26
OriginTransplant -0.24748    0.09445   -2.62

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.525
eta_squared(Chl.lme_TP2_KL)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |           0.26 | [0.03, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##SS
Chl.lme_TP2_SS<-lmer(Chl_ug.cm2~Origin+(1|Genotype), data=Coral.TP2[which(Coral.TP2$Site=="SS"),])
summary(Chl.lme_TP2_SS)
Linear mixed model fit by REML ['lmerMod']
Formula: Chl_ug.cm2 ~ Origin + (1 | Genotype)
   Data: Coral.TP2[which(Coral.TP2$Site == "SS"), ]

REML criterion at convergence: 36.7

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.2515 -0.7498 -0.1994  0.6152  2.0640 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.1653   0.4065  
 Residual             0.2069   0.4548  
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error t value
(Intercept)        1.8391     0.2689   6.838
OriginTransplant   0.4118     0.1857   2.218

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.345
eta_squared(Chl.lme_TP2_SS)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |           0.20 | [0.01, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##Summary statistics by Site and Origin
TP2_Chl.sum<-summarySE(Coral.TP2, measurevar="Chl_ug.cm2", groupvars=c("Site", "Origin", "Site.Orig"), na.rm=TRUE)

##Plot Average Chlorophyll across Treatments
TP2_Chl.plot<-ggplot(TP2_Chl.sum, aes(x=Site, y=Chl_ug.cm2, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=Chl_ug.cm2-se, ymax=Chl_ug.cm2+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
  labs(x="Site and Origin", y=expression(paste('Total Chlorophyll (\u03BCg cm'^-2*")")), colour="Origin")+
  ylim(0, 2.5)+
  annotate("text", x=c(1,2), y=c(1.5, 2.5), label="*", size=sig.sz, fontface="bold"); TP2_Chl.plot

TP3

##Subset Timepoint 3 
Coral.TP3<-subset(Coral.rm, TimeP=="TP3")

Protein Host

##Check normality
hist(Coral.TP3$TP_ug.cm2_C)

shapiro.test(Coral.TP3$TP_ug.cm2_C)

    Shapiro-Wilk normality test

data:  Coral.TP3$TP_ug.cm2_C
W = 0.97395, p-value = 0.3582
#Normal

##Model 
#Function of Site and Origin, with Genotype as a Random effect
#Interactions between Origin and Site
Prot.C.lme_TP3<-lmer(TP_ug.cm2_C~Origin*Site+(1|Genotype), data=Coral.TP3)

##Check residuals
Prot.C.lme_res_TP3 <- simulateResiduals(fittedModel = Prot.C.lme_TP3, plot = F)
plot(Prot.C.lme_res_TP3)


##Model results
summary(Prot.C.lme_TP3)
Linear mixed model fit by REML ['lmerMod']
Formula: TP_ug.cm2_C ~ Origin * Site + (1 | Genotype)
   Data: Coral.TP3

REML criterion at convergence: 507.3

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.52281 -0.56107 -0.09932  0.69343  2.85970 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 1765     42.01   
 Residual             4332     65.82   
Number of obs: 48, groups:  Genotype, 3

Fixed effects:
                        Estimate Std. Error t value
(Intercept)              354.577     30.812  11.508
OriginTransplant         -28.338     26.869  -1.055
SiteSS                    11.510     26.869   0.428
OriginTransplant:SiteSS    6.695     37.999   0.176

Correlation of Fixed Effects:
            (Intr) OrgnTr SiteSS
OrgnTrnspln -0.436              
SiteSS      -0.436  0.500       
OrgnTrn:SSS  0.308 -0.707 -0.707
eta_squared(Prot.C.lme_TP3)
# Effect Size for ANOVA (Type III)

Parameter   | Eta2 (partial) |       95% CI
-------------------------------------------
Origin      |           0.04 | [0.00, 1.00]
Site        |           0.01 | [0.00, 1.00]
Origin:Site |       7.38e-04 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].

Protein Symbiont

##Check normality
hist(Coral.TP3$TP_ug.cm2_S)

shapiro.test(Coral.TP3$TP_ug.cm2_S)

    Shapiro-Wilk normality test

data:  Coral.TP3$TP_ug.cm2_S
W = 0.95992, p-value = 0.1002
#Normal

##Model
#Function of Site and Origin, with Genotype as a Random effect
#Interactions between Origin and Site
Prot.S.lme_TP3<-lmer(TP_ug.cm2_S~Origin*Site+(1|Genotype), data=Coral.TP3)

##Check residuals
Prot.S.lme_res_TP3 <- simulateResiduals(fittedModel = Prot.S.lme_TP3, plot = F)
plot(Prot.S.lme_res_TP3)


##Model results
summary(Prot.S.lme_TP3)
Linear mixed model fit by REML ['lmerMod']
Formula: TP_ug.cm2_S ~ Origin * Site + (1 | Genotype)
   Data: Coral.TP3

REML criterion at convergence: 497.6

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.04853 -0.63564 -0.04301  0.40723  2.41329 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept)  606.5   24.63   
 Residual             3588.9   59.91   
Number of obs: 48, groups:  Genotype, 3

Fixed effects:
                        Estimate Std. Error t value
(Intercept)               350.04      22.39  15.635
OriginTransplant          -31.07      24.46  -1.270
SiteSS                     54.24      24.46   2.218
OriginTransplant:SiteSS    40.43      34.59   1.169

Correlation of Fixed Effects:
            (Intr) OrgnTr SiteSS
OrgnTrnspln -0.546              
SiteSS      -0.546  0.500       
OrgnTrn:SSS  0.386 -0.707 -0.707
eta_squared(Prot.S.lme_TP3)
# Effect Size for ANOVA (Type III)

Parameter   | Eta2 (partial) |       95% CI
-------------------------------------------
Origin      |       9.30e-03 | [0.00, 1.00]
Site        |           0.31 | [0.13, 1.00]
Origin:Site |           0.03 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].

Effect size of Origin for each Site

##KL
Prot.S.lme_TP3_KL<-lmer(TP_ug.cm2_S~Origin+(1|Genotype), data=Coral.TP3[which(Coral.TP3$Site=="KL"),])
summary(Prot.S.lme_TP3_KL)
Linear mixed model fit by REML ['lmerMod']
Formula: TP_ug.cm2_S ~ Origin + (1 | Genotype)
   Data: Coral.TP3[which(Coral.TP3$Site == "KL"), ]

REML criterion at convergence: 240.3

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-1.73973 -0.61677 -0.06905  0.34373  2.28780 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept)  267.5   16.36   
 Residual             2444.8   49.45   
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error t value
(Intercept)        350.04      17.11  20.453
OriginTransplant   -31.07      20.19  -1.539

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.590
eta_squared(Prot.S.lme_TP3_KL)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |           0.11 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##SS
Prot.S.lme_TP3_SS<-lmer(TP_ug.cm2_S~Origin+(1|Genotype), data=Coral.TP3[which(Coral.TP3$Site=="SS"),])
summary(Prot.S.lme_TP3_SS)
Linear mixed model fit by REML ['lmerMod']
Formula: TP_ug.cm2_S ~ Origin + (1 | Genotype)
   Data: Coral.TP3[which(Coral.TP3$Site == "SS"), ]

REML criterion at convergence: 255.5

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-1.80428 -0.53697  0.01298  0.48663  2.22260 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept)  939.7   30.66   
 Residual             4737.1   68.83   
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error t value
(Intercept)       404.272     26.608  15.193
OriginTransplant    9.355     28.098   0.333

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.528
eta_squared(Prot.S.lme_TP3_SS)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |       5.51e-03 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##Summary statistics by Site and Origin
TP3_ProtSym.sum<-summarySE(Coral.TP3, measurevar="TP_ug.cm2_S", groupvars=c("Site", "Origin", "Site.Orig"), na.rm=TRUE)

##Plot Average Symbiont Protein across Treatments
TP3_ProtSym.plot<-ggplot(TP3_ProtSym.sum, aes(x=Site, y=TP_ug.cm2_S, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=TP_ug.cm2_S-se, ymax=TP_ug.cm2_S+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
  labs(x="Site and Origin", y=expression(paste('Symbiont Protein (\u03BCg cm'^-2*")")), colour="Origin")+
  ylim(250, 450); TP3_ProtSym.plot

Biomass Host

##Check normality
hist(Coral.TP3$AFDW_mg.cm2_C)

shapiro.test(Coral.TP3$AFDW_mg.cm2_C)

    Shapiro-Wilk normality test

data:  Coral.TP3$AFDW_mg.cm2_C
W = 0.98042, p-value = 0.5962
#Normal

##Model
#Function of Site and Origin, with Genotype as a Random effect
#Interactions between Origin and Site
Bio.C.lme_TP3<-lmer(AFDW_mg.cm2_C~Origin*Site+(1|Genotype), data=Coral.TP3)

##Check residuals
Bio.C.lme_res_TP3 <- simulateResiduals(fittedModel = Bio.C.lme_TP3, plot = F)
plot(Bio.C.lme_res_TP3)


##Model results
summary(Bio.C.lme_TP3)
Linear mixed model fit by REML ['lmerMod']
Formula: AFDW_mg.cm2_C ~ Origin * Site + (1 | Genotype)
   Data: Coral.TP3

REML criterion at convergence: 1.8

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.39331 -0.54299  0.06699  0.61611  2.15929 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.007168 0.08467 
 Residual             0.045972 0.21441 
Number of obs: 48, groups:  Genotype, 3

Fixed effects:
                        Estimate Std. Error t value
(Intercept)              1.18826    0.07887  15.066
OriginTransplant        -0.12291    0.08753  -1.404
SiteSS                   0.09539    0.08753   1.090
OriginTransplant:SiteSS  0.12089    0.12379   0.977

Correlation of Fixed Effects:
            (Intr) OrgnTr SiteSS
OrgnTrnspln -0.555              
SiteSS      -0.555  0.500       
OrgnTrn:SSS  0.392 -0.707 -0.707
eta_squared(Bio.C.lme_TP3)
# Effect Size for ANOVA (Type III)

Parameter   | Eta2 (partial) |       95% CI
-------------------------------------------
Origin      |           0.02 | [0.00, 1.00]
Site        |           0.13 | [0.01, 1.00]
Origin:Site |           0.02 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].

Effect size of Origin for each Site

##KL
Bio.C.lme_TP3_KL<-lmer(AFDW_mg.cm2_C~Origin+(1|Genotype), data=Coral.TP3[which(Coral.TP3$Site=="KL"),])
summary(Bio.C.lme_TP3_KL)
Linear mixed model fit by REML ['lmerMod']
Formula: AFDW_mg.cm2_C ~ Origin + (1 | Genotype)
   Data: Coral.TP3[which(Coral.TP3$Site == "KL"), ]

REML criterion at convergence: 4.6

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.11835 -0.65919 -0.03638  0.66514  2.01105 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.002671 0.05168 
 Residual             0.055878 0.23638 
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error t value
(Intercept)       1.18826    0.07448  15.955
OriginTransplant -0.12291    0.09650  -1.274

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.648
eta_squared(Bio.C.lme_TP3_KL)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |           0.08 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##SS
Bio.C.lme_TP3_SS<-lmer(AFDW_mg.cm2_C~Origin+(1|Genotype), data=Coral.TP3[which(Coral.TP3$Site=="SS"),])
summary(Bio.C.lme_TP3_SS)
Linear mixed model fit by REML ['lmerMod']
Formula: AFDW_mg.cm2_C ~ Origin + (1 | Genotype)
   Data: Coral.TP3[which(Coral.TP3$Site == "SS"), ]

REML criterion at convergence: -1.9

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-1.92899 -0.46522  0.05763  0.57468  2.06374 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.006692 0.0818  
 Residual             0.039684 0.1992  
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                  Estimate Std. Error t value
(Intercept)       1.283651   0.074415  17.250
OriginTransplant -0.002024   0.081326  -0.025

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.546
eta_squared(Bio.C.lme_TP3_SS)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |       3.10e-05 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##Summary statistics by Site and Origin
TP3_BioHost.sum<-summarySE(Coral.TP3, measurevar="AFDW_mg.cm2_C", groupvars=c("Site", "Origin", "Site.Orig"), na.rm=TRUE)

##Plot Average Host Biomass across Treatments
TP3_BioHost.plot<-ggplot(TP3_BioHost.sum, aes(x=Site, y=AFDW_mg.cm2_C, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=AFDW_mg.cm2_C-se, ymax=AFDW_mg.cm2_C+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
  labs(x="Site and Origin", y=expression(paste('Host Biomass (mg cm'^-2*")")), colour="Origin")+
  ylim(0, 2); TP3_BioHost.plot

Biomass Symbionts

##Check normality
hist(Coral.TP3$AFDW_mg.cm2_S)

shapiro.test(Coral.TP3$AFDW_mg.cm2_S)

    Shapiro-Wilk normality test

data:  Coral.TP3$AFDW_mg.cm2_S
W = 0.95017, p-value = 0.04062
#Slightly non Normal

hist(log(Coral.TP3$AFDW_mg.cm2_S+1))

shapiro.test(log(Coral.TP3$AFDW_mg.cm2_S+1))

    Shapiro-Wilk normality test

data:  log(Coral.TP3$AFDW_mg.cm2_S + 1)
W = 0.97082, p-value = 0.2726
#Normal

##Model 
#Function of Site and Origin, with Genotype as a Random effect
#Interactions between Origin and Site
Bio.S.lme_TP3<-lmer(log(AFDW_mg.cm2_S+1)~Origin*Site+(1|Genotype), data=Coral.TP3)

##Check residuals
Bio.S.lme_res_TP3 <- simulateResiduals(fittedModel = Bio.S.lme_TP3, plot = F)
plot(Bio.S.lme_res_TP3)


##Model results
summary(Bio.S.lme_TP3)
Linear mixed model fit by REML ['lmerMod']
Formula: log(AFDW_mg.cm2_S + 1) ~ Origin * Site + (1 | Genotype)
   Data: Coral.TP3

REML criterion at convergence: -59.8

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.9013 -0.6371 -0.1087  0.6759  2.0985 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.001717 0.04143 
 Residual             0.011351 0.10654 
Number of obs: 48, groups:  Genotype, 3

Fixed effects:
                        Estimate Std. Error t value
(Intercept)              0.50341    0.03896  12.920
OriginTransplant        -0.02185    0.04349  -0.502
SiteSS                   0.07684    0.04349   1.767
OriginTransplant:SiteSS  0.04053    0.06151   0.659

Correlation of Fixed Effects:
            (Intr) OrgnTr SiteSS
OrgnTrnspln -0.558              
SiteSS      -0.558  0.500       
OrgnTrn:SSS  0.395 -0.707 -0.707
eta_squared(Bio.S.lme_TP3)
# Effect Size for ANOVA (Type III)

Parameter   | Eta2 (partial) |       95% CI
-------------------------------------------
Origin      |       6.34e-05 | [0.00, 1.00]
Site        |           0.19 | [0.04, 1.00]
Origin:Site |           0.01 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].

Effect size of Origin for each Site

##KL
Bio.S.lme_TP3_KL<-lmer(log(AFDW_mg.cm2_S+1)~Origin+(1|Genotype), data=Coral.TP3[which(Coral.TP3$Site=="KL"),])
summary(Bio.S.lme_TP3_KL)
Linear mixed model fit by REML ['lmerMod']
Formula: log(AFDW_mg.cm2_S + 1) ~ Origin + (1 | Genotype)
   Data: Coral.TP3[which(Coral.TP3$Site == "KL"), ]

REML criterion at convergence: -32.8

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.19334 -0.63480 -0.09404  0.31252  2.01340 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.001809 0.04253 
 Residual             0.009689 0.09843 
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error t value
(Intercept)       0.50341    0.03755  13.405
OriginTransplant -0.02185    0.04018  -0.544

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.535
eta_squared(Bio.S.lme_TP3_KL)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |           0.01 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##SS
Bio.S.lme_TP3_SS<-lmer(log(AFDW_mg.cm2_S+1)~Origin+(1|Genotype), data=Coral.TP3[which(Coral.TP3$Site=="SS"),])
summary(Bio.S.lme_TP3_SS)
Linear mixed model fit by REML ['lmerMod']
Formula: log(AFDW_mg.cm2_S + 1) ~ Origin + (1 | Genotype)
   Data: Coral.TP3[which(Coral.TP3$Site == "SS"), ]

REML criterion at convergence: -26.4

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-1.70864 -0.59241 -0.00109  0.59598  2.08623 

Random effects:
 Groups   Name        Variance  Std.Dev.
 Genotype (Intercept) 0.0008163 0.02857 
 Residual             0.0136003 0.11662 
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error t value
(Intercept)       0.58025    0.03749  15.478
OriginTransplant  0.01868    0.04761   0.392

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.635
eta_squared(Bio.S.lme_TP3_SS)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |       7.63e-03 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##Summary statistics by Site and Origin
TP3_BioSym.sum<-summarySE(Coral.TP3, measurevar="AFDW_mg.cm2_S", groupvars=c("Site", "Origin", "Site.Orig"), na.rm=TRUE)

##Plot Average Symbiont Biomass across Treatments
TP3_BioSym.plot<-ggplot(TP3_BioSym.sum, aes(x=Site, y=AFDW_mg.cm2_S, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=AFDW_mg.cm2_S-se, ymax=AFDW_mg.cm2_S+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
  labs(x="Site and Origin", y=expression(paste('Symbiont Biomass (mg cm'^-2*")")), colour="Origin")+
  ylim(0, 1); TP3_BioSym.plot

Chlorophyll

##Check normality
hist(Coral.TP3$Chl_ug.cm2)

shapiro.test(Coral.TP3$Chl_ug.cm2)

    Shapiro-Wilk normality test

data:  Coral.TP3$Chl_ug.cm2
W = 0.92502, p-value = 0.004491
#Not normal

hist(log(Coral.TP3$Chl_ug.cm2+1))

shapiro.test(log(Coral.TP3$Chl_ug.cm2+1))

    Shapiro-Wilk normality test

data:  log(Coral.TP3$Chl_ug.cm2 + 1)
W = 0.97477, p-value = 0.3837
#Normal

##Model
#Function of Site and Origin, with Genotype as a Random effect
#Interactions between Origin and Site
Chl.lme_TP3<-lmer(log(Chl_ug.cm2+1)~Origin*Site+(1|Genotype), data=Coral.TP3)

##Check residuals
Chl.lme_res_TP3 <- simulateResiduals(fittedModel = Chl.lme_TP3, plot = F)
plot(Chl.lme_res_TP3)


##Model results
summary(Chl.lme_TP3)
Linear mixed model fit by REML ['lmerMod']
Formula: log(Chl_ug.cm2 + 1) ~ Origin * Site + (1 | Genotype)
   Data: Coral.TP3

REML criterion at convergence: -35.4

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.25062 -0.55117 -0.02076  0.43420  2.75244 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.01951  0.1397  
 Residual             0.01831  0.1353  
Number of obs: 48, groups:  Genotype, 3

Fixed effects:
                        Estimate Std. Error t value
(Intercept)              0.81996    0.08960   9.151
OriginTransplant        -0.10476    0.05525  -1.896
SiteSS                   0.18045    0.05525   3.266
OriginTransplant:SiteSS  0.13664    0.07813   1.749

Correlation of Fixed Effects:
            (Intr) OrgnTr SiteSS
OrgnTrnspln -0.308              
SiteSS      -0.308  0.500       
OrgnTrn:SSS  0.218 -0.707 -0.707
eta_squared(Chl.lme_TP3)
# Effect Size for ANOVA (Type III)

Parameter   | Eta2 (partial) |       95% CI
-------------------------------------------
Origin      |           0.02 | [0.00, 1.00]
Site        |           0.49 | [0.31, 1.00]
Origin:Site |           0.07 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].

Effect size of Origin for each Site

##KL
Chl.lme_TP3_KL<-lmer(log(Chl_ug.cm2+1)~Origin+(1|Genotype), data=Coral.TP3[which(Coral.TP3$Site=="KL"),])
summary(Chl.lme_TP3_KL)
Linear mixed model fit by REML ['lmerMod']
Formula: log(Chl_ug.cm2 + 1) ~ Origin + (1 | Genotype)
   Data: Coral.TP3[which(Coral.TP3$Site == "KL"), ]

REML criterion at convergence: -19

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.7968 -0.6704 -0.2815  0.8139  2.1670 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.009698 0.09848 
 Residual             0.016854 0.12982 
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error t value
(Intercept)        0.8200     0.0681  12.041
OriginTransplant  -0.1048     0.0530  -1.977

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.389
eta_squared(Chl.lme_TP3_KL)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |           0.16 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##SS
Chl.lme_TP3_SS<-lmer(log(Chl_ug.cm2+1)~Origin+(1|Genotype), data=Coral.TP3[which(Coral.TP3$Site=="SS"),])
summary(Chl.lme_TP3_SS)
Linear mixed model fit by REML ['lmerMod']
Formula: log(Chl_ug.cm2 + 1) ~ Origin + (1 | Genotype)
   Data: Coral.TP3[which(Coral.TP3$Site == "SS"), ]

REML criterion at convergence: -16.6

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.11066 -0.45318 -0.01187  0.63929  2.41481 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.03310  0.1819  
 Residual             0.01702  0.1305  
Number of obs: 24, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error t value
(Intercept)       1.00040    0.11159   8.965
OriginTransplant  0.03189    0.05326   0.599

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.239
eta_squared(Chl.lme_TP3_SS)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |           0.02 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##Summary statistics by Site and Origin
TP3_Chl.sum<-summarySE(Coral.TP3, measurevar="Chl_ug.cm2", groupvars=c("Site", "Origin", "Site.Orig"), na.rm=TRUE)

##Plot Average Chlorophyll across Treatments
TP3_Chl.plot<-ggplot(TP3_Chl.sum, aes(x=Site, y=Chl_ug.cm2, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=Chl_ug.cm2-se, ymax=Chl_ug.cm2+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
  labs(x="Site and Origin", y=expression(paste('Total Chlorophyll (\u03BCg cm'^-2*")")), colour="Origin")+
  ylim(0, 2.5)+
  annotate("text", x=1, y=1.7, label="-", size=levels.sz, fontface="bold"); TP3_Chl.plot

TP4

##Subset Timepoint 4 
Coral.TP4<-subset(Coral.rm, TimeP=="TP4")

Protein Host

##Check normality
hist(Coral.TP4$TP_ug.cm2_C)

shapiro.test(Coral.TP4$TP_ug.cm2_C)

    Shapiro-Wilk normality test

data:  Coral.TP4$TP_ug.cm2_C
W = 0.97592, p-value = 0.4503
#Normal

##Model 
#Function of Site and Origin, with Genotype as a Random effect
#Interactions between Origin and Site
Prot.C.lme_TP4<-lmer(TP_ug.cm2_C~Origin*Site+(1|Genotype), data=Coral.TP4)

##Check residuals
Prot.C.lme_res_TP4 <- simulateResiduals(fittedModel = Prot.C.lme_TP4, plot = F)
plot(Prot.C.lme_res_TP4)


##Model results
summary(Prot.C.lme_TP4)
Linear mixed model fit by REML ['lmerMod']
Formula: TP_ug.cm2_C ~ Origin * Site + (1 | Genotype)
   Data: Coral.TP4

REML criterion at convergence: 492.6

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-1.82648 -0.74846  0.02454  0.66400  1.93010 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept)   23.74   4.872  
 Residual             5739.32  75.758  
Number of obs: 46, groups:  Genotype, 3

Fixed effects:
                        Estimate Std. Error t value
(Intercept)               329.20      22.05  14.930
OriginTransplant           21.29      31.63   0.673
SiteSS                     50.44      30.93   1.631
OriginTransplant:SiteSS   -67.31      44.72  -1.505

Correlation of Fixed Effects:
            (Intr) OrgnTr SiteSS
OrgnTrnspln -0.686              
SiteSS      -0.701  0.489       
OrgnTrn:SSS  0.485 -0.707 -0.692
eta_squared(Prot.C.lme_TP4)
# Effect Size for ANOVA (Type III)

Parameter   | Eta2 (partial) |       95% CI
-------------------------------------------
Origin      |       7.51e-03 | [0.00, 1.00]
Site        |           0.01 | [0.00, 1.00]
Origin:Site |           0.05 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].

Protein Symbiont

##Check normality
hist(Coral.TP4$TP_ug.cm2_S)

shapiro.test(Coral.TP4$TP_ug.cm2_S)

    Shapiro-Wilk normality test

data:  Coral.TP4$TP_ug.cm2_S
W = 0.98874, p-value = 0.9316
#Normal

##Model
#Function of Site and Origin, with Genotype as a Random effect
#Interactions between Origin and Site
Prot.S.lme_TP4<-lmer(TP_ug.cm2_S~Origin*Site+(1|Genotype), data=Coral.TP4)

##Check residuals
Prot.S.lme_res_TP4 <- simulateResiduals(fittedModel = Prot.S.lme_TP4, plot = F)
plot(Prot.S.lme_res_TP4)


##Model results
summary(Prot.S.lme_TP4)
Linear mixed model fit by REML ['lmerMod']
Formula: TP_ug.cm2_S ~ Origin * Site + (1 | Genotype)
   Data: Coral.TP4

REML criterion at convergence: 464

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.9674 -0.6915 -0.1394  0.7468  1.8746 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept)  258.6   16.08   
 Residual             2793.9   52.86   
Number of obs: 46, groups:  Genotype, 3

Fixed effects:
                        Estimate Std. Error t value
(Intercept)              283.146     17.862  15.852
OriginTransplant           2.715     22.078   0.123
SiteSS                    94.191     21.579   4.365
OriginTransplant:SiteSS  -14.298     31.203  -0.458

Correlation of Fixed Effects:
            (Intr) OrgnTr SiteSS
OrgnTrnspln -0.590              
SiteSS      -0.604  0.489       
OrgnTrn:SSS  0.418 -0.707 -0.692
eta_squared(Prot.S.lme_TP4)
# Effect Size for ANOVA (Type III)

Parameter   | Eta2 (partial) |       95% CI
-------------------------------------------
Origin      |       2.00e-03 | [0.00, 1.00]
Site        |           0.44 | [0.25, 1.00]
Origin:Site |       5.22e-03 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].

Effect size of Origin for each Site

##KL
Prot.S.lme_TP4_KL<-lmer(TP_ug.cm2_S~Origin+(1|Genotype), data=Coral.TP4[which(Coral.TP4$Site=="KL"),])
summary(Prot.S.lme_TP4_KL)
Linear mixed model fit by REML ['lmerMod']
Formula: TP_ug.cm2_S ~ Origin + (1 | Genotype)
   Data: Coral.TP4[which(Coral.TP4$Site == "KL"), ]

REML criterion at convergence: 233.2

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.9026 -0.5130 -0.1508  0.5988  1.9630 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept)  123.5   11.11   
 Residual             3004.0   54.81   
Number of obs: 23, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error t value
(Intercept)       283.146     17.074  16.584
OriginTransplant    2.801     22.890   0.122

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.641
eta_squared(Prot.S.lme_TP4_KL)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |       7.84e-04 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##SS
Prot.S.lme_TP4_SS<-lmer(TP_ug.cm2_S~Origin+(1|Genotype), data=Coral.TP4[which(Coral.TP4$Site=="SS"),])
summary(Prot.S.lme_TP4_SS)
Linear mixed model fit by REML ['lmerMod']
Formula: TP_ug.cm2_S ~ Origin + (1 | Genotype)
   Data: Coral.TP4[which(Coral.TP4$Site == "SS"), ]

REML criterion at convergence: 231.3

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-1.95275 -0.71834 -0.03221  0.77696  1.62897 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept)  300.3   17.33   
 Residual             2653.9   51.52   
Number of obs: 23, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error t value
(Intercept)        377.34      17.92   21.05
OriginTransplant   -10.98      21.53   -0.51

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.573
eta_squared(Prot.S.lme_TP4_SS)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |           0.01 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##Summary statistics by Site and Origin
TP4_ProtSym.sum<-summarySE(Coral.TP4, measurevar="TP_ug.cm2_S", groupvars=c("Site", "Origin", "Site.Orig"), na.rm=TRUE)

##Plot Average Symbiont Protein across Treatments
TP4_ProtSym.plot<-ggplot(TP4_ProtSym.sum, aes(x=Site, y=TP_ug.cm2_S, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=TP_ug.cm2_S-se, ymax=TP_ug.cm2_S+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
  labs(x="Site and Origin", y=expression(paste('Symbiont Protein (\u03BCg cm'^-2*")")), colour="Origin")+
  ylim(250, 450); TP4_ProtSym.plot

Biomass Host

##Check normality
hist(Coral.TP4$AFDW_mg.cm2_C)

shapiro.test(Coral.TP4$AFDW_mg.cm2_C)

    Shapiro-Wilk normality test

data:  Coral.TP4$AFDW_mg.cm2_C
W = 0.98656, p-value = 0.8669
#Normal

##Model
#Function of Site and Origin, with Genotype as a Random effect
#Interactions between Origin and Site
Bio.C.lme_TP4<-lmer(AFDW_mg.cm2_C~Origin*Site+(1|Genotype), data=Coral.TP4)

##Check residuals
Bio.C.lme_res_TP4 <- simulateResiduals(fittedModel = Bio.C.lme_TP4, plot = F)
plot(Bio.C.lme_res_TP4)


##Model results
summary(Bio.C.lme_TP4)
Linear mixed model fit by REML ['lmerMod']
Formula: AFDW_mg.cm2_C ~ Origin * Site + (1 | Genotype)
   Data: Coral.TP4

REML criterion at convergence: 31.4

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-1.94819 -0.65333  0.01107  0.59003  2.21357 

Random effects:
 Groups   Name        Variance  Std.Dev.
 Genotype (Intercept) 0.0006586 0.02566 
 Residual             0.0974518 0.31217 
Number of obs: 46, groups:  Genotype, 3

Fixed effects:
                        Estimate Std. Error t value
(Intercept)              0.99501    0.09133  10.895
OriginTransplant         0.17260    0.13032   1.324
SiteSS                   0.33916    0.12744   2.661
OriginTransplant:SiteSS -0.38438    0.18428  -2.086

Correlation of Fixed Effects:
            (Intr) OrgnTr SiteSS
OrgnTrnspln -0.682              
SiteSS      -0.698  0.489       
OrgnTrn:SSS  0.483 -0.707 -0.692
eta_squared(Bio.C.lme_TP4)
# Effect Size for ANOVA (Type III)

Parameter   | Eta2 (partial) |       95% CI
-------------------------------------------
Origin      |       1.12e-03 | [0.00, 1.00]
Site        |           0.06 | [0.00, 1.00]
Origin:Site |           0.10 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].

Effect size of Origin for each Site


##KL
Bio.C.lme_TP4_KL<-lmer(AFDW_mg.cm2_C~Origin+(1|Genotype), data=Coral.TP4[which(Coral.TP4$Site=="KL"),])
boundary (singular) fit: see help('isSingular')
summary(Bio.C.lme_TP4_KL)
Linear mixed model fit by REML ['lmerMod']
Formula: AFDW_mg.cm2_C ~ Origin + (1 | Genotype)
   Data: Coral.TP4[which(Coral.TP4$Site == "KL"), ]

REML criterion at convergence: 22.6

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-1.65092 -0.56347  0.01929  0.47522  1.89563 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.0000   0.0000  
 Residual             0.1361   0.3689  
Number of obs: 23, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error t value
(Intercept)        0.9950     0.1065   9.344
OriginTransplant   0.1727     0.1540   1.121

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.692
optimizer (nloptwrap) convergence code: 0 (OK)
boundary (singular) fit: see help('isSingular')
eta_squared(Bio.C.lme_TP4_KL)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |           0.06 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##SS
Bio.C.lme_TP4_SS<-lmer(AFDW_mg.cm2_C~Origin+(1|Genotype), data=Coral.TP4[which(Coral.TP4$Site=="SS"),])
summary(Bio.C.lme_TP4_SS)
Linear mixed model fit by REML ['lmerMod']
Formula: AFDW_mg.cm2_C ~ Origin + (1 | Genotype)
   Data: Coral.TP4[which(Coral.TP4$Site == "SS"), ]

REML criterion at convergence: 4.4

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.2767 -0.7007  0.1653  0.5506  2.0180 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.009792 0.09895 
 Residual             0.052524 0.22918 
Number of obs: 23, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error t value
(Intercept)       1.33417    0.08741  15.263
OriginTransplant -0.20931    0.09578  -2.185

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.523
eta_squared(Bio.C.lme_TP4_SS)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |           0.20 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##Summary statistics by Site and Origin
TP4_BioHost.sum<-summarySE(Coral.TP4, measurevar="AFDW_mg.cm2_C", groupvars=c("Site", "Origin", "Site.Orig"), na.rm=TRUE)

##Plot Average Host Biomass across Treatments
TP4_BioHost.plot<-ggplot(TP4_BioHost.sum, aes(x=Site, y=AFDW_mg.cm2_C, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=AFDW_mg.cm2_C-se, ymax=AFDW_mg.cm2_C+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
  labs(x="Site and Origin", y=expression(paste('Host Biomass (mg cm'^-2*")")), colour="Origin")+
  ylim(0, 2)+
  annotate("text", x=2, y=1.6, label="*", size=sig.sz, fontface="bold"); TP4_BioHost.plot

Biomass Symbionts

##Check normality
hist(Coral.TP4$AFDW_mg.cm2_S)

shapiro.test(Coral.TP4$AFDW_mg.cm2_S)

    Shapiro-Wilk normality test

data:  Coral.TP4$AFDW_mg.cm2_S
W = 0.96144, p-value = 0.1304
#Normal

##Model 
#Function of Site and Origin, with Genotype as a Random effect
#Interactions between Origin and Site
Bio.S.lme_TP4<-lmer(AFDW_mg.cm2_S~Origin*Site+(1|Genotype), data=Coral.TP4)
boundary (singular) fit: see help('isSingular')
##Check residuals
Bio.S.lme_res_TP4 <- simulateResiduals(fittedModel = Bio.S.lme_TP4, plot = F)
plot(Bio.S.lme_res_TP4)


##Model results
summary(Bio.S.lme_TP4)
Linear mixed model fit by REML ['lmerMod']
Formula: AFDW_mg.cm2_S ~ Origin * Site + (1 | Genotype)
   Data: Coral.TP4

REML criterion at convergence: -13.3

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.9850 -0.7648 -0.1116  0.6976  1.8287 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.00000  0.0000  
 Residual             0.03381  0.1839  
Number of obs: 46, groups:  Genotype, 3

Fixed effects:
                        Estimate Std. Error t value
(Intercept)              0.58851    0.05308  11.087
OriginTransplant         0.02029    0.07675   0.264
SiteSS                   0.15893    0.07507   2.117
OriginTransplant:SiteSS -0.05653    0.10855  -0.521

Correlation of Fixed Effects:
            (Intr) OrgnTr SiteSS
OrgnTrnspln -0.692              
SiteSS      -0.707  0.489       
OrgnTrn:SSS  0.489 -0.707 -0.692
optimizer (nloptwrap) convergence code: 0 (OK)
boundary (singular) fit: see help('isSingular')
eta_squared(Bio.S.lme_TP4)
# Effect Size for ANOVA (Type III)

Parameter   | Eta2 (partial) |       95% CI
-------------------------------------------
Origin      |       5.14e-04 | [0.00, 1.00]
Site        |           0.12 | [0.01, 1.00]
Origin:Site |       6.42e-03 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].

Effect size of Origin for each Site

##KL
Bio.S.lme_TP4_KL<-lmer(AFDW_mg.cm2_S~Origin+(1|Genotype), data=Coral.TP4[which(Coral.TP4$Site=="KL"),])
boundary (singular) fit: see help('isSingular')
summary(Bio.S.lme_TP4_KL)
Linear mixed model fit by REML ['lmerMod']
Formula: AFDW_mg.cm2_S ~ Origin + (1 | Genotype)
   Data: Coral.TP4[which(Coral.TP4$Site == "KL"), ]

REML criterion at convergence: -9

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.8536 -0.7454 -0.2379  0.7005  1.9338 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.00000  0.0000  
 Residual             0.03023  0.1739  
Number of obs: 23, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error t value
(Intercept)       0.58851    0.05019   11.72
OriginTransplant  0.02029    0.07258    0.28

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.692
optimizer (nloptwrap) convergence code: 0 (OK)
boundary (singular) fit: see help('isSingular')
eta_squared(Bio.S.lme_TP4_KL)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |       3.71e-03 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##SS
Bio.S.lme_TP4_SS<-lmer(AFDW_mg.cm2_S~Origin+(1|Genotype), data=Coral.TP4[which(Coral.TP4$Site=="SS"),])
boundary (singular) fit: see help('isSingular')
summary(Bio.S.lme_TP4_SS)
Linear mixed model fit by REML ['lmerMod']
Formula: AFDW_mg.cm2_S ~ Origin + (1 | Genotype)
   Data: Coral.TP4[which(Coral.TP4$Site == "SS"), ]

REML criterion at convergence: -4.5

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.8877 -0.8214  0.1483  0.7055  1.5821 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.00000  0.0000  
 Residual             0.03739  0.1934  
Number of obs: 23, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error t value
(Intercept)       0.74744    0.05582  13.391
OriginTransplant -0.03625    0.08071  -0.449

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.692
optimizer (nloptwrap) convergence code: 0 (OK)
boundary (singular) fit: see help('isSingular')
eta_squared(Bio.S.lme_TP4_SS)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |       9.51e-03 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##Summary statistics by Site and Origin
TP4_BioSym.sum<-summarySE(Coral.TP4, measurevar="AFDW_mg.cm2_S", groupvars=c("Site", "Origin", "Site.Orig"), na.rm=TRUE)

##Plot Average Symbiont Biomass across Treatments
TP4_BioSym.plot<-ggplot(TP4_BioSym.sum, aes(x=Site, y=AFDW_mg.cm2_S, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=AFDW_mg.cm2_S-se, ymax=AFDW_mg.cm2_S+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
  labs(x="Site and Origin", y=expression(paste('Symbiont Biomass (mg cm'^-2*")")), colour="Origin")+
  ylim(0, 1); TP4_BioSym.plot

Chlorophyll

##Check normality
hist(Coral.TP4$Chl_ug.cm2)

shapiro.test(Coral.TP4$Chl_ug.cm2)

    Shapiro-Wilk normality test

data:  Coral.TP4$Chl_ug.cm2
W = 0.94799, p-value = 0.03927
#Slightly non normal

hist(log(Coral.TP4$Chl_ug.cm2+1))

shapiro.test(log(Coral.TP4$Chl_ug.cm2+1))

    Shapiro-Wilk normality test

data:  log(Coral.TP4$Chl_ug.cm2 + 1)
W = 0.97457, p-value = 0.4047
#Normal

##Model
#Function of Site and Origin, with Genotype as a Random effect
#Interactions between Origin and Site
Chl.lme_TP4<-lmer(log(Chl_ug.cm2+1)~Origin*Site+(1|Genotype), data=Coral.TP4)

##Check residuals
Chl.lme_res_TP4 <- simulateResiduals(fittedModel = Chl.lme_TP4, plot = F)
plot(Chl.lme_res_TP4)


##Model results
summary(Chl.lme_TP4)
Linear mixed model fit by REML ['lmerMod']
Formula: log(Chl_ug.cm2 + 1) ~ Origin * Site + (1 | Genotype)
   Data: Coral.TP4

REML criterion at convergence: -35.8

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.5527 -0.6247  0.1083  0.5659  1.8596 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.02813  0.1677  
 Residual             0.01693  0.1301  
Number of obs: 46, groups:  Genotype, 3

Fixed effects:
                         Estimate Std. Error t value
(Intercept)              0.939828   0.103867   9.048
OriginTransplant        -0.005543   0.054370  -0.102
SiteSS                   0.335684   0.053119   6.319
OriginTransplant:SiteSS  0.049977   0.076810   0.651

Correlation of Fixed Effects:
            (Intr) OrgnTr SiteSS
OrgnTrnspln -0.250              
SiteSS      -0.256  0.489       
OrgnTrn:SSS  0.177 -0.706 -0.692
eta_squared(Chl.lme_TP4)
# Effect Size for ANOVA (Type III)

Parameter   | Eta2 (partial) |       95% CI
-------------------------------------------
Origin      |       6.34e-03 | [0.00, 1.00]
Site        |           0.69 | [0.55, 1.00]
Origin:Site |           0.01 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].

Effect size of Origin for each Site


##KL
Chl.lme_TP4_KL<-lmer(log(Chl_ug.cm2+1)~Origin+(1|Genotype), data=Coral.TP4[which(Coral.TP4$Site=="KL"),])
summary(Chl.lme_TP4_KL)
Linear mixed model fit by REML ['lmerMod']
Formula: log(Chl_ug.cm2 + 1) ~ Origin + (1 | Genotype)
   Data: Coral.TP4[which(Coral.TP4$Site == "KL"), ]

REML criterion at convergence: -14

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-1.59344 -0.58861 -0.05038  0.48137  1.88220 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.01194  0.1093  
 Residual             0.02028  0.1424  
Number of obs: 23, groups:  Genotype, 3

Fixed effects:
                  Estimate Std. Error t value
(Intercept)       0.939828   0.075300  12.481
OriginTransplant -0.005243   0.059554  -0.088

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.377
eta_squared(Chl.lme_TP4_KL)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |       4.07e-04 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##SS
Chl.lme_TP4_SS<-lmer(log(Chl_ug.cm2+1)~Origin+(1|Genotype), data=Coral.TP4[which(Coral.TP4$Site=="SS"),])
summary(Chl.lme_TP4_SS)
Linear mixed model fit by REML ['lmerMod']
Formula: log(Chl_ug.cm2 + 1) ~ Origin + (1 | Genotype)
   Data: Coral.TP4[which(Coral.TP4$Site == "SS"), ]

REML criterion at convergence: -25

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.80744 -0.47238  0.03677  0.58308  1.31155 

Random effects:
 Groups   Name        Variance Std.Dev.
 Genotype (Intercept) 0.049098 0.22158 
 Residual             0.009964 0.09982 
Number of obs: 23, groups:  Genotype, 3

Fixed effects:
                 Estimate Std. Error t value
(Intercept)       1.27551    0.13113   9.727
OriginTransplant  0.04346    0.04175   1.041

Correlation of Fixed Effects:
            (Intr)
OrgnTrnspln -0.152
eta_squared(Chl.lme_TP4_SS)
# Effect Size for ANOVA (Type III)

Parameter | Eta2 (partial) |       95% CI
-----------------------------------------
Origin    |           0.05 | [0.00, 1.00]

- One-sided CIs: upper bound fixed at [1.00].
##Summary statistics by Site and Origin
TP4_Chl.sum<-summarySE(Coral.TP4, measurevar="Chl_ug.cm2", groupvars=c("Site", "Origin", "Site.Orig"), na.rm=TRUE)

##Plot Average Chlorophyll across Treatments
TP4_Chl.plot<-ggplot(TP4_Chl.sum, aes(x=Site, y=Chl_ug.cm2, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=Chl_ug.cm2-se, ymax=Chl_ug.cm2+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
  labs(x="Site and Origin", y=expression(paste('Total Chlorophyll (\u03BCg cm'^-2*")")), colour="Origin")+
  ylim(0, 3.5); TP4_Chl.plot

Effect Size over Time

##Dataframe of effect size results
Phys.ES<-data.frame(TimeP=c(rep("TP1",8), rep("TP2",8), rep("TP3",8), rep("TP4",8)), 
                    Site=c(rep(c("KL", "SS"),16)),
                    Metric=c(rep(c("AFDW_mg.cm2_C", "AFDW_mg.cm2_C", "AFDW_mg.cm2_S", "AFDW_mg.cm2_S", "TP_ug.cm2_S", "TP_ug.cm2_S", "Chl_ug.cm2", "Chl_ug.cm2"),4)),
                    EtaSq=c(eta_squared(Bio.C.lme_TP1_KL)$Eta2_partial,
                             eta_squared(Bio.C.lme_TP1_SS)$Eta2_partial,
                             eta_squared(Bio.S.lme_TP1_KL)$Eta2_partial,
                             eta_squared(Bio.S.lme_TP1_SS)$Eta2_partial,
                             eta_squared(Prot.S.lme_TP1_KL)$Eta2_partial,
                             eta_squared(Prot.S.lme_TP1_SS)$Eta2_partial, 
                             eta_squared(Chl.lme_TP1_KL)$Eta2_partial,
                             eta_squared(Chl.lme_TP1_SS)$Eta2_partial, 
                      eta_squared(Bio.C.lme_TP2_KL)$Eta2_partial,
                             eta_squared(Bio.C.lme_TP2_SS)$Eta2_partial,
                             eta_squared(Bio.S.lme_TP2_KL)$Eta2_partial,
                             eta_squared(Bio.S.lme_TP2_SS)$Eta2_partial,
                             eta_squared(Prot.S.lme_TP2_KL)$Eta2_partial,
                             eta_squared(Prot.S.lme_TP2_SS)$Eta2_partial, 
                             eta_squared(Chl.lme_TP2_KL)$Eta2_partial,
                             eta_squared(Chl.lme_TP2_SS)$Eta2_partial, 
                        eta_squared(Bio.C.lme_TP3_KL)$Eta2_partial,
                             eta_squared(Bio.C.lme_TP3_SS)$Eta2_partial,
                             eta_squared(Bio.S.lme_TP3_KL)$Eta2_partial,
                             eta_squared(Bio.S.lme_TP3_SS)$Eta2_partial,
                             eta_squared(Prot.S.lme_TP3_KL)$Eta2_partial,
                             eta_squared(Prot.S.lme_TP3_SS)$Eta2_partial, 
                             eta_squared(Chl.lme_TP3_KL)$Eta2_partial,
                             eta_squared(Chl.lme_TP3_SS)$Eta2_partial, 
                      eta_squared(Bio.C.lme_TP4_KL)$Eta2_partial,
                             eta_squared(Bio.C.lme_TP4_SS)$Eta2_partial,
                             eta_squared(Bio.S.lme_TP4_KL)$Eta2_partial,
                             eta_squared(Bio.S.lme_TP4_SS)$Eta2_partial,
                             eta_squared(Prot.S.lme_TP4_KL)$Eta2_partial,
                             eta_squared(Prot.S.lme_TP4_SS)$Eta2_partial, 
                             eta_squared(Chl.lme_TP4_KL)$Eta2_partial,
                             eta_squared(Chl.lme_TP4_SS)$Eta2_partial),
                    Pvalue=c(summary(Bio.C.lme_TP1_KL)$coefficients[10],
                             summary(Bio.C.lme_TP1_SS)$coefficients[10],
                             summary(Bio.S.lme_TP1_KL)$coefficients[10],
                             summary(Bio.S.lme_TP1_SS)$coefficients[10],
                             summary(Prot.S.lme_TP1_KL)$coefficients[10],
                             summary(Prot.S.lme_TP1_SS)$coefficients[10], 
                             summary(Chl.lme_TP1_KL)$coefficients[10],
                             summary(Chl.lme_TP1_SS)$coefficients[10], 
                      summary(Bio.C.lme_TP2_KL)$coefficients[10],
                             summary(Bio.C.lme_TP2_SS)$coefficients[10],
                             summary(Bio.S.lme_TP2_KL)$coefficients[10],
                             summary(Bio.S.lme_TP2_SS)$coefficients[10],
                             summary(Prot.S.lme_TP2_KL)$coefficients[10],
                             summary(Prot.S.lme_TP2_SS)$coefficients[10], 
                             summary(Chl.lme_TP2_KL)$coefficients[10],
                             summary(Chl.lme_TP2_SS)$coefficients[10], 
                        summary(Bio.C.lme_TP3_KL)$coefficients[10],
                             summary(Bio.C.lme_TP3_SS)$coefficients[10],
                             summary(Bio.S.lme_TP3_KL)$coefficients[10],
                             summary(Bio.S.lme_TP3_SS)$coefficients[10],
                             summary(Prot.S.lme_TP3_KL)$coefficients[10],
                             summary(Prot.S.lme_TP3_SS)$coefficients[10], 
                             summary(Chl.lme_TP3_KL)$coefficients[10],
                             summary(Chl.lme_TP3_SS)$coefficients[10], 
                      summary(Bio.C.lme_TP4_KL)$coefficients[10],
                             summary(Bio.C.lme_TP4_SS)$coefficients[10],
                             summary(Bio.S.lme_TP4_KL)$coefficients[10],
                             summary(Bio.S.lme_TP4_SS)$coefficients[10],
                             summary(Prot.S.lme_TP4_KL)$coefficients[10],
                             summary(Prot.S.lme_TP4_SS)$coefficients[10], 
                             summary(Chl.lme_TP4_KL)$coefficients[10],
                             summary(Chl.lme_TP4_SS)$coefficients[10]))



Phys.ES$Sig<-ifelse(Phys.ES$Pvalue<0.001, "***", ifelse(Phys.ES$Pvalue<0.01, "**", ifelse(Phys.ES$Pvalue<0.05, "*", ifelse(Phys.ES$Pvalue<0.1, "-", NA))))

Host Biomass

Bio.C.ES.plot<-ggplot(Phys.ES[which(Phys.ES$Metric=="AFDW_mg.cm2_C"),], aes(x=TimeP, y=EtaSq, fill=Site))+
  geom_bar(stat="identity", position=position_dodge())+
    scale_fill_manual(values=Site.colors.o)+
theme_classic()+
  ggtitle("Host Biomass")+
  theme(plot.title = element_text(colour="black", size=panel.lab.sz, hjust=0.5), axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
   labs(x="Time Point", y=expression(paste("Effect Size (p", eta^2, ")")), colour="Site")+
  ylim(0, 0.6)+
  geom_text(aes(label=Sig), vjust=-0.02, color="black", position=position_dodge(0.9), size=levels.sz, fontface="bold"); Bio.C.ES.plot

Symbiont Biomass

Bio.S.ES.plot<-ggplot(Phys.ES[which(Phys.ES$Metric=="AFDW_mg.cm2_S"),], aes(x=TimeP, y=EtaSq, fill=Site))+
  geom_bar(stat="identity", position=position_dodge())+
    scale_fill_manual(values=Site.colors.o)+
theme_classic()+
  ggtitle("Symbiont Biomass")+
  theme(plot.title = element_text(colour="black", size=panel.lab.sz, hjust=0.5), axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
   labs(x="Time Point", y=expression(paste("Effect Size (p", eta^2, ")")), colour="Site")+
  ylim(0, 0.6)+
  geom_text(aes(label=Sig), vjust=-0.02, color="black", position=position_dodge(0.9), size=levels.sz, fontface="bold"); Bio.S.ES.plot

Symbiont Protein

Prot.S.ES.plot<-ggplot(Phys.ES[which(Phys.ES$Metric=="TP_ug.cm2_S"),], aes(x=TimeP, y=EtaSq, fill=Site))+
  geom_bar(stat="identity", position=position_dodge())+
    scale_fill_manual(values=Site.colors.o)+
theme_classic()+
  ggtitle("Symbiont Protein")+
  theme(plot.title = element_text(colour="black", size=panel.lab.sz, hjust=0.5), axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
   labs(x="Time Point", y=expression(paste("Effect Size (p", eta^2, ")")), colour="Site")+
  ylim(0, 0.6)+
  geom_text(aes(label=Sig), vjust=-0.02, color="black", position=position_dodge(0.9), size=levels.sz, fontface="bold"); Prot.S.ES.plot

Chlorophyll

Chl.ES.plot<-ggplot(Phys.ES[which(Phys.ES$Metric=="Chl_ug.cm2"),], aes(x=TimeP, y=EtaSq, fill=Site))+
  geom_bar(stat="identity", position=position_dodge())+
    scale_fill_manual(values=Site.colors.o)+
theme_classic()+
  ggtitle("Chlorophyll")+
  theme(plot.title = element_text(colour="black", size=panel.lab.sz, hjust=0.5), axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
   labs(x="Time Point", y=expression(paste("Effect Size (p", eta^2, ")")), colour="Site")+
  ylim(0, 0.6)+
  geom_text(aes(label=Sig), vjust=-0.02, color="black", position=position_dodge(0.9), size=levels.sz, fontface="bold"); Chl.ES.plot

Figures

Figure 2 Physiology Effect Size

Adjust Figures for Panel

##Host Biomass
Bio.C.ES.plot.cut<-ggplot(Phys.ES[which(Phys.ES$Metric=="AFDW_mg.cm2_C"),], aes(x=TimeP, y=EtaSq, fill=Site))+
  geom_bar(stat="identity", position=position_dodge())+
    scale_fill_manual(values=Site.colors.o)+
theme_classic()+
  ggtitle("Host Biomass")+
  theme(plot.title = element_text(colour="black", size=panel.lab.sz, hjust=0.5), axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"), legend.position=c(0.15, 0.8))+
   labs(x="", y=expression(paste("Effect Size (p", eta^2, ")")), colour="Site")+
  ylim(0, 0.6)+
  geom_text(aes(label=Sig), vjust=-0.02, color="black", position=position_dodge(0.9), size=levels.sz, fontface="bold")

##Symbiont Biomass
Bio.S.ES.plot.cut<-ggplot(Phys.ES[which(Phys.ES$Metric=="AFDW_mg.cm2_S"),], aes(x=TimeP, y=EtaSq, fill=Site))+
  geom_bar(stat="identity", position=position_dodge())+
    scale_fill_manual(values=Site.colors.o)+
theme_classic()+
  ggtitle("Symbiont Biomass")+
  theme(plot.title = element_text(colour="black", size=panel.lab.sz, hjust=0.5), axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), legend.position="none")+
   labs(x="", y="", colour="Site")+
  ylim(0, 0.6)+
  geom_text(aes(label=Sig), vjust=-0.02, color="black", position=position_dodge(0.9), size=levels.sz, fontface="bold")

##Symbiont Protein
Prot.S.ES.plot.cut<-ggplot(Phys.ES[which(Phys.ES$Metric=="TP_ug.cm2_S"),], aes(x=TimeP, y=EtaSq, fill=Site))+
  geom_bar(stat="identity", position=position_dodge())+
    scale_fill_manual(values=Site.colors.o)+
theme_classic()+
  ggtitle("Symbiont Protein")+
  theme(plot.title = element_text(colour="black", size=panel.lab.sz, hjust=0.5), axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), legend.position="none")+
   labs(x="Time Point", y=expression(paste("Effect Size (p", eta^2, ")")), colour="Site")+
  ylim(0, 0.6)+
  geom_text(aes(label=Sig), vjust=-0.02, color="black", position=position_dodge(0.9), size=levels.sz, fontface="bold")

##Chlorophyll
Chl.ES.plot.cut<-ggplot(Phys.ES[which(Phys.ES$Metric=="Chl_ug.cm2"),], aes(x=TimeP, y=EtaSq, fill=Site))+
  geom_bar(stat="identity", position=position_dodge())+
    scale_fill_manual(values=Site.colors.o)+
theme_classic()+
  ggtitle("Chlorophyll")+
  theme(plot.title = element_text(colour="black", size=panel.lab.sz, hjust=0.5), axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), legend.position="none")+
   labs(x="Time Point", y="", colour="Site")+
  ylim(0, 0.6)+
  geom_text(aes(label=Sig), vjust=-0.02, color="black", position=position_dodge(0.9), size=levels.sz, fontface="bold")

Figure 2

##Create Panel
PhysES_fig<-plot_grid(Bio.C.ES.plot.cut, Bio.S.ES.plot.cut, 
                      Prot.S.ES.plot.cut, Chl.ES.plot.cut,
                    rel_widths=c(0.9, 1, 0.9, 1), 
                    rel_heights = c(1, 1, 1, 1),
                    nrow=2, ncol=2, byrow=T, labels = c("A", "B", "C", "D"))
Warning: Removed 8 rows containing missing values (`geom_text()`).Warning: Removed 8 rows containing missing values (`geom_text()`).Warning: Removed 8 rows containing missing values (`geom_text()`).Warning: Removed 8 rows containing missing values (`geom_text()`).
##Save Figure
ggsave(filename="Figures/02_Physiology/Fig2_PhysiologyEffectSizes.png", plot=PhysES_fig, dpi=300, width=10, height=8, units="in")

Figure S3 Univariate Panels

Adjust Figures for Panel


##Biomass Host
TP1_BioHost.plot.cut<-ggplot(TP1_BioHost.sum, aes(x=Site, y=AFDW_mg.cm2_C, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=AFDW_mg.cm2_C-se, ymax=AFDW_mg.cm2_C+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  ggtitle("TP1")+
  theme(plot.title = element_text(colour="black", size=panel.lab.sz, face="bold", hjust=0.5),
    axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.position="none")+
  labs(x="", y=expression(paste('Host Biomass (mg cm'^-2*")")), colour="Origin")+
  ylim(0.75, 1.5)+
  annotate("text", x=1, y=1.35, label="*", size=levels.sz, fontface="bold")


TP2_BioHost.plot.cut<-ggplot(TP2_BioHost.sum, aes(x=Site, y=AFDW_mg.cm2_C, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=AFDW_mg.cm2_C-se, ymax=AFDW_mg.cm2_C+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  ggtitle("TP2")+
  theme(plot.title = element_text(colour="black", size=panel.lab.sz, face="bold", hjust=0.5),
        axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.position="none")+
  labs(x="", y="", colour="Origin")+
  ylim(0.75, 1.5)+
  annotate("text", x=2, y=1.35, label="-", size=levels.sz, fontface="bold")

TP3_BioHost.plot.cut<-ggplot(TP3_BioHost.sum, aes(x=Site, y=AFDW_mg.cm2_C, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=AFDW_mg.cm2_C-se, ymax=AFDW_mg.cm2_C+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  ggtitle("TP3")+
  theme(plot.title = element_text(colour="black", size=panel.lab.sz, face="bold", hjust=0.5),
        axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.position="none")+
  labs(x="", y="", colour="Origin")+
  ylim(0.75, 1.5)

TP4_BioHost.plot.cut<-ggplot(TP4_BioHost.sum, aes(x=Site, y=AFDW_mg.cm2_C, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=AFDW_mg.cm2_C-se, ymax=AFDW_mg.cm2_C+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  ggtitle("TP4")+
  theme(plot.title = element_text(colour="black", size=panel.lab.sz, face="bold", hjust=0.5),
        axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
  labs(x="", y="", colour="Origin")+
  ylim(0.75, 1.5)+
  annotate("text", x=2, y=1.45, label="*", size=levels.sz, fontface="bold")


##Biomass Symbiont
TP1_BioSym.plot.cut<-ggplot(TP1_BioSym.sum, aes(x=Site, y=AFDW_mg.cm2_S, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=AFDW_mg.cm2_S-se, ymax=AFDW_mg.cm2_S+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.position="none")+
  labs(x="", y=expression(paste('Symbiont Biomass (mg cm'^-2*")")), colour="Origin")+
  ylim(0.45, 0.95)+
  annotate("text", x=2, y=0.82, label="**", size=levels.sz, fontface="bold")


TP2_BioSym.plot.cut<-ggplot(TP2_BioSym.sum, aes(x=Site, y=AFDW_mg.cm2_S, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=AFDW_mg.cm2_S-se, ymax=AFDW_mg.cm2_S+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.position="none")+
  labs(x="", y="", colour="Origin")+
  ylim(0.45, 0.95)+
  annotate("text", x=1, y=0.82, label="*", size=levels.sz, fontface="bold")


TP3_BioSym.plot.cut<-ggplot(TP3_BioSym.sum, aes(x=Site, y=AFDW_mg.cm2_S, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=AFDW_mg.cm2_S-se, ymax=AFDW_mg.cm2_S+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.position="none")+
  labs(x="", y="", colour="Origin")+
  ylim(0.45, 0.95)

TP4_BioSym.plot.cut<-ggplot(TP4_BioSym.sum, aes(x=Site, y=AFDW_mg.cm2_S, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=AFDW_mg.cm2_S-se, ymax=AFDW_mg.cm2_S+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
  labs(x="", y="", colour="Origin")+
  ylim(0.45, 0.95)


##Protein Symbiont
TP1_ProtSym.plot.cut<-ggplot(TP1_ProtSym.sum, aes(x=Site, y=TP_ug.cm2_S, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=TP_ug.cm2_S-se, ymax=TP_ug.cm2_S+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.position="none")+
  labs(x="", y=expression(paste('Symbiont Protein (\u03BCg cm'^-2*")")), colour="Origin")+
  ylim(250, 550)+
  annotate("text", x=2, y=535, label="**", size=levels.sz, fontface="bold")


TP2_ProtSym.plot.cut<-ggplot(TP2_ProtSym.sum, aes(x=Site, y=TP_ug.cm2_S, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=TP_ug.cm2_S-se, ymax=TP_ug.cm2_S+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.position="none")+
  labs(x="", y="", colour="Origin")+
  ylim(250, 550)

TP3_ProtSym.plot.cut<-ggplot(TP3_ProtSym.sum, aes(x=Site, y=TP_ug.cm2_S, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=TP_ug.cm2_S-se, ymax=TP_ug.cm2_S+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.position="none")+
  labs(x="", y="", colour="Origin")+
  ylim(250, 550)

TP4_ProtSym.plot.cut<-ggplot(TP4_ProtSym.sum, aes(x=Site, y=TP_ug.cm2_S, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=TP_ug.cm2_S-se, ymax=TP_ug.cm2_S+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
  labs(x="", y="", colour="Origin")+
  ylim(250, 550)


##Chlorophyll
TP1_Chl.plot.cut<-ggplot(TP1_Chl.sum, aes(x=Site, y=Chl_ug.cm2, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=Chl_ug.cm2-se, ymax=Chl_ug.cm2+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.position="none")+
  labs(x="Site", y=expression(paste('Total Chlorophyll (\u03BCg cm'^-2*")")), colour="Origin")+
  ylim(0.5, 3.25)+
  annotate("text", x=2, y=1.7, label="***", size=levels.sz, fontface="bold")


TP2_Chl.plot.cut<-ggplot(TP2_Chl.sum, aes(x=Site, y=Chl_ug.cm2, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=Chl_ug.cm2-se, ymax=Chl_ug.cm2+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.position="none")+
  labs(x="Site", y="", colour="Origin")+
  ylim(0.5, 3.25)+
  annotate("text", x=c(1,2), y=c(1.7, 2.6), label="*", size=levels.sz, fontface="bold")


TP3_Chl.plot.cut<-ggplot(TP3_Chl.sum, aes(x=Site, y=Chl_ug.cm2, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=Chl_ug.cm2-se, ymax=Chl_ug.cm2+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.position="none")+
  labs(x="Site", y="", colour="Origin")+
  ylim(0.5, 3.25)+
  annotate("text", x=1, y=1.7, label="-", size=levels.sz, fontface="bold")

TP4_Chl.plot.cut<-ggplot(TP4_Chl.sum, aes(x=Site, y=Chl_ug.cm2, colour=Site.Orig)) + 
  scale_colour_manual(values=Orig.colors.o)+
  geom_errorbar(aes(ymin=Chl_ug.cm2-se, ymax=Chl_ug.cm2+se), width=cap.sz, linewidth=bar.sz, position=position_dodge(width=0.5)) +
  geom_point(size=point.sz, position=position_dodge(width=0.5))+
  theme_classic()+
  theme(axis.title.x = element_text(size = axis.title.sz), axis.title.y = element_text(size = axis.title.sz), 
        axis.text.x=element_text(size=axis.txt.sz, colour="black"), axis.text.y=element_text(size=axis.txt.sz, colour="black"), 
        legend.text=element_text(size=leg.txt.sz), legend.title=element_text(size=leg.title.sz), 
        legend.box.background = element_rect(color = "black"))+
  labs(x="Site", y="", colour="Origin")+
  ylim(0.5, 3.25)

Figure S3

##Create Panel
Phys_fig<-plot_grid(
  TP1_BioHost.plot.cut,TP2_BioHost.plot.cut,TP3_BioHost.plot.cut,TP4_BioHost.plot.cut,
  TP1_BioSym.plot.cut,TP2_BioSym.plot.cut,TP3_BioSym.plot.cut,TP4_BioSym.plot.cut,
  TP1_ProtSym.plot.cut,TP2_ProtSym.plot.cut,TP3_ProtSym.plot.cut,TP4_ProtSym.plot.cut,
  TP1_Chl.plot.cut,TP2_Chl.plot.cut,TP3_Chl.plot.cut,TP4_Chl.plot.cut,
                    rel_widths=c(rep(c(0.75, 0.75, 0.75,1),4)), 
                    rel_heights = c(1,0.85,0.85,0.85),
                    nrow=4, ncol=4, byrow=T, labels = NULL)

##Save Figure
ggsave(filename="Figures/02_Physiology/FigS3_PhysiologyMetrics.png", plot=Phys_fig, dpi=300, width=12, height=14, units="in")
LS0tDQp0aXRsZTogIkNvcmFsIFBoeXNpb2xvZ3kgRm9sbG93aW5nIFJlY2lwcm9jYWwgVHJhbnNwbGFudCINCmF1dGhvcjogIlNlcmVuYSBIYWNrZXJvdHQiDQpkYXRlOiAiMS8xLzIwMjQiDQpvdXRwdXQ6DQogIGh0bWxfbm90ZWJvb2s6DQogICAgdG9jOiB5ZXMNCiAgICB0b2NfZmxvYXQ6IHllcw0KICBodG1sX2RvY3VtZW50Og0KICAgIHRvYzogeWVzDQogICAgZGZfcHJpbnQ6IHBhZ2VkDQotLS0NCg0KIyBTZXR1cA0KDQpgYGB7ciBTZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQ0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFLCB3YXJuaW5nID0gRkFMU0UsIG1lc3NhZ2UgPSBGQUxTRSkNCmBgYA0KDQoNCiMjIyBMb2FkIFBhY2thZ2VzDQpgYGB7cn0NCiMjSW5zdGFsbCBQYWNrYWdlcyBpZiBOZWVkZWQNCmlmICghcmVxdWlyZSgiZ2dwbG90MiIpKSBpbnN0YWxsLnBhY2thZ2VzKCJnZ3Bsb3QyIikNCmlmICghcmVxdWlyZSgiY293cGxvdCIpKSBpbnN0YWxsLnBhY2thZ2VzKCJjb3dwbG90IikNCmlmICghcmVxdWlyZSgiUm1pc2MiKSkgaW5zdGFsbC5wYWNrYWdlcygiUm1pc2MiKQ0KaWYgKCFyZXF1aXJlKCJsbWU0IikpIGluc3RhbGwucGFja2FnZXMoImxtZTQiKQ0KaWYgKCFyZXF1aXJlKCJ2ZWdhbiIpKSBpbnN0YWxsLnBhY2thZ2VzKCJ2ZWdhbiIpDQppZiAoIXJlcXVpcmUoImNvcnJwbG90IikpIGluc3RhbGwucGFja2FnZXMoImNvcnJwbG90IikNCmlmICghcmVxdWlyZSgiREhBUk1hIikpIGluc3RhbGwucGFja2FnZXMoIkRIQVJNYSIpDQppZiAoIXJlcXVpcmUoImVmZmVjdHNpemUiKSkgaW5zdGFsbC5wYWNrYWdlcygiZWZmZWN0c2l6ZSIpDQppZiAoIXJlcXVpcmUoImVtbWVhbnMiKSkgaW5zdGFsbC5wYWNrYWdlcygiZW1tZWFucyIpDQoNCiMjTG9hZCBQYWNrYWdlcw0KbGlicmFyeShnZ3Bsb3QyKSAjUmVxdWlyZWQgZm9yIGdncGxvdHMNCmxpYnJhcnkoY293cGxvdCkgI1JlcXVpcmVkIGZvciBwbG90dGluZyBwYW5lbCBmaWd1cmVzDQpsaWJyYXJ5KFJtaXNjKSAjUmVxdWlyZWQgZm9yIFN1bW1hcnlTRSBmdW5jdGlvbg0KbGlicmFyeShsbWU0KSAjUmVxdWlyZWQgZm9yIG1peGVkIGVmZmVjdHMgbW9kZWxpbmcNCmxpYnJhcnkodmVnYW4pICNSZXF1aXJlZCBmb3IgbXVsdGl2YXJpYXRlIGFuYWx5c2lzIFBFUk0NCmxpYnJhcnkoY29ycnBsb3QpICNSZXF1aXJlZCBmb3IgY29ycmVsYXRpb24gcGxvdA0KbGlicmFyeShESEFSTWEpICNSZXF1aXJlZCB0byBjaGVjayByZXNpZHVhbHMgb2YgbWl4ZWQgZWZmZWN0cyBtb2RlbHMNCmxpYnJhcnkoZWZmZWN0c2l6ZSkgI1JlcXVpcmVkIGZvciBldGFfc3F1YXJlZCBlZmZlY3Qgc2l6ZXMNCmxpYnJhcnkoZW1tZWFucykgI1JlcXVpcmVkIGZvciBwYWlyd2lzZSBjb21wYXJpc29ucyANCg0KYGBgDQoNCg0KIyMjIEdyYXBoaW5nIFBhcmFtZXRlcnMNCmBgYHtyfQ0KI05vdGU6IFJ1biAiR3JhcGhpbmcgUGFyYW1ldGVycyIgc2VjdGlvbiBmcm9tIDAxX0V4cGVyaW1lbnRhbFNldHVwLlJtZCBmaWxlDQpgYGANCg0KDQojIFNhbXBsZSBEYXRhIGFuZCBNZXRhZGF0YQ0KDQojIyMgTG9hZCBhbmQgT3JnYW5pemUgRGF0YQ0KYGBge3J9DQojI0xvYWQgRGF0YQ0KI05vdGU6IFBoeXNpb2xvZ2ljYWwgbWV0cmljcyBjYWxjdWxhdGVkIGluIDAyX1BoeXNpb2xvZ3lNZXRyaWNzLlIgZmlsZQ0KQ29yYWw8LXJlYWQuY3N2KCJPdXRwdXRzL0NvcmFsRGF0YS5jc3YiLCBoZWFkZXI9VFJVRSkNCg0KIyNTZXQgZmFjdG9yIHZhcmlhYmxlcw0KQ29yYWwkVGltZVA8LWZhY3RvcihDb3JhbCRUaW1lUCwgbGV2ZWxzPWMoIlRQMSIsICJUUDIiLCAiVFAzIiwgIlRQNCIpKQ0KQ29yYWwkU2l0ZTwtZmFjdG9yKENvcmFsJFNpdGUsIGxldmVscz1jKCJLTCIsICJTUyIpKQ0KQ29yYWwkR2Vub3R5cGU8LWZhY3RvcihDb3JhbCRHZW5vdHlwZSwgbGV2ZWxzPWMoIkFDOCIsICJBQzEwIiwgIkFDMTIiKSkNCkNvcmFsJE9yaWc8LWZhY3RvcihDb3JhbCRPcmlnLCBsZXZlbHM9YygiTiIsICJUIikpDQpDb3JhbCRPcmlnaW48LWZhY3RvcihDb3JhbCRPcmlnaW4sIGxldmVscz1jKCJOYXRpdmUiLCAiVHJhbnNwbGFudCIpKQ0KQ29yYWwkU2l0ZS5PcmlnPC1mYWN0b3IoQ29yYWwkU2l0ZS5PcmlnLCBsZXZlbHM9YygiS0wuTiIsICJLTC5UIiwgIlNTLk4iLCAiU1MuVCIpKQ0KDQoNCmBgYA0KDQoNCiMgTXVsdGl2YXJpYXRlIEFuYWx5c2lzDQoNCiMjIyBhZG9uaXMgT21lZ2FTcSBGdW5jdGlvbg0KYGBge3J9DQojJyBDYWxjdWxhdGUgKHBhcnRpYWwpIE9tZWdhLXNxdWFyZWQgKGVmZmVjdC1zaXplIGNhbGN1bGF0aW9uKSBmb3IgUEVSTUFOT1ZBIGFuZCBhZGQgaXQgdG8gdGhlIGlucHV0IG9iamVjdA0KIycNCiMnIEBwYXJhbSBhZG9uaXNPdXRwdXQgQW4gYWRvbmlzIG9iamVjdA0KIycgQHBhcmFtIHBhcnRpYWwgU2hvdWxkIHBhcnRpYWwgb21lZ2Etc3F1YXJlZCBiZSBjYWxjdWxhdGVkIChzYW1wbGUgc2l6ZSBhZGp1c3RlZCkuIERlZmF1bHQgVFJVRQ0KIycgQHJldHVybiBPcmlnaW5hbCBhZG9uaXMgb2JqZWN0IHdpdGggdGhlIChwYXJ0aWFsKSBPbWVnYS1zcXVhcmVkIHZhbHVlcyBhZGRlZA0KIycgQGltcG9ydCB2ZWdhbg0KIycgQGV4cG9ydA0KYWRvbmlzX09tZWdhU3EgPC0gZnVuY3Rpb24oYWRvbmlzT3V0cHV0LCBwYXJ0aWFsID0gVFJVRSl7DQogICAgaWYoIShpcyhhZG9uaXNPdXRwdXQsICJhZG9uaXMiKSB8fCBpcyhhZG9uaXNPdXRwdXQsICJhbm92YS5jY2EiKSkpDQogICAgICAgIHN0b3AoIklucHV0IHNob3VsZCBiZSBhbiBhZG9uaXMgb2JqZWN0IikNCiAgICBpZiAoaXMoYWRvbmlzT3V0cHV0LCAiYW5vdmEuY2NhIikpIHsNCiAgICAgICAgYW92X3RhYiA8LSBhZG9uaXNPdXRwdXQNCiAgICAgICAgYW92X3RhYiRNZWFuU3FzIDwtIGFvdl90YWIkU3VtT2ZTcXMgLyBhb3ZfdGFiJERmDQogICAgICAgIGFvdl90YWIkTWVhblNxc1tsZW5ndGgoYW92X3RhYiREZildIDwtIE5BDQogICAgfSBlbHNlIHsNCiAgICAgICAgYW92X3RhYiA8LSBhZG9uaXNPdXRwdXQkYW92LnRhYg0KICAgIH0NCiAgICBoZWFkaW5nIDwtIGF0dHIoYW92X3RhYiwgImhlYWRpbmciKQ0KICAgIE1TX3JlcyA8LSBhb3ZfdGFiW3BtYXRjaCgiUmVzaWR1YWwiLCByb3duYW1lcyhhb3ZfdGFiKSksICJNZWFuU3FzIl0NCiAgICBTU190b3QgPC0gYW92X3RhYltyb3duYW1lcyhhb3ZfdGFiKSA9PSAiVG90YWwiLCAiU3Vtc09mU3FzIl0NCiAgICBOIDwtIGFvdl90YWJbcm93bmFtZXMoYW92X3RhYikgPT0gIlRvdGFsIiwgIkRmIl0gKyAxDQogICAgaWYocGFydGlhbCl7DQogICAgICAgIG9tZWdhIDwtIGFwcGx5KGFvdl90YWIsIDEsIGZ1bmN0aW9uKHgpICh4WyJEZiJdKih4WyJNZWFuU3FzIl0tTVNfcmVzKSkvKHhbIkRmIl0qeFsiTWVhblNxcyJdKyhOLXhbIkRmIl0pKk1TX3JlcykpDQogICAgICAgIGFvdl90YWIkcGFyT21lZ2FTcSA8LSBjKG9tZWdhWzE6KGxlbmd0aChvbWVnYSktMildLCBOQSwgTkEpDQogICAgfSBlbHNlIHsNCiAgICAgICAgb21lZ2EgPC0gYXBwbHkoYW92X3RhYiwgMSwgZnVuY3Rpb24oeCkgKHhbIlN1bXNPZlNxcyJdLXhbIkRmIl0qTVNfcmVzKS8oU1NfdG90K01TX3JlcykpDQogICAgICAgIGFvdl90YWIkT21lZ2FTcSA8LSBjKG9tZWdhWzE6KGxlbmd0aChvbWVnYSktMildLCBOQSwgTkEpDQogICAgfQ0KICAgIGlmIChpcyhhZG9uaXNPdXRwdXQsICJhZG9uaXMiKSkNCiAgICAgICAgY25fb3JkZXIgPC0gYygiRGYiLCAiU3Vtc09mU3FzIiwgIk1lYW5TcXMiLCAiRi5Nb2RlbCIsICJSMiIsDQogICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRpYWwpICJwYXJPbWVnYVNxIiBlbHNlICJPbWVnYVNxIiwgIlByKD5GKSIpDQogICAgZWxzZQ0KICAgICAgICBjbl9vcmRlciA8LSBjKCJEZiIsICJTdW1PZlNxcyIsICJGIiwgaWYgKHBhcnRpYWwpICJwYXJPbWVnYVNxIiBlbHNlICJPbWVnYVNxIiwNCiAgICAgICAgICAgICAgICAgICAgICAiUHIoPkYpIikNCiAgICBhb3ZfdGFiIDwtIGFvdl90YWJbLCBjbl9vcmRlcl0NCiAgICBhdHRyKGFvdl90YWIsICJuYW1lcyIpIDwtIGNuX29yZGVyDQogICAgYXR0cihhb3ZfdGFiLCAiaGVhZGluZyIpIDwtIGhlYWRpbmcNCiAgICBpZiAoaXMoYWRvbmlzT3V0cHV0LCAiYWRvbmlzIikpDQogICAgICAgIGFkb25pc091dHB1dCRhb3YudGFiIDwtIGFvdl90YWINCiAgICBlbHNlDQogICAgICAgIGFkb25pc091dHB1dCA8LSBhb3ZfdGFiDQogICAgcmV0dXJuKGFkb25pc091dHB1dCkNCn0NCmBgYA0KDQoNCiMjIyBDaGVjayBDb3JyZWxhdGlvbg0KYGBge3J9DQojI1JlbW92ZSBOQSdzDQpuYW1lcyhDb3JhbCkNCkNvcmFsLnJtPC1uYS5vbWl0KENvcmFsKQ0KDQojI0xvZyArMSB0cmFuc2Zvcm0gDQpDb3JhbC5sb2c8LUNvcmFsLnJtDQpDb3JhbC5sb2dbLC1jKDE6MTApXTwtbG9nKENvcmFsLnJtWywtYygxOjEwKV0rMSkNCiAgDQpQaHlzLmNvcjwtcmNvcnIoYXMubWF0cml4KENvcmFsLmxvZ1ssLWMoMToxMCldKSwgdHlwZT0icGVhcnNvbiIpDQpQaHlzLmNvcg0KDQpkaWFnKFBoeXMuY29yJFApPC0wDQoNCmNvcnJwbG90KFBoeXMuY29yJHIsIHR5cGU9InVwcGVyIiwgb3JkZXI9ImhjbHVzdCIsIA0KICAgICAgICAgcC5tYXQgPSBQaHlzLmNvciRQLCBzaWcubGV2ZWwgPSAwLjAxLCBpbnNpZyA9ICJibGFuayIpDQoNCmBgYA0KDQoNCiMjIyBUUDENCmBgYHtyfQ0KIyNTdWJzZXQgVGltZXBvaW50IDEgDQpDb3JhbC5sb2dfVFAxPC1zdWJzZXQoQ29yYWwubG9nLCBUaW1lUD09IlRQMSIpDQoNCmBgYA0KDQojIyMjIFBFUk1BTk9WQQ0KYGBge3J9DQojI1BFUk1BTk9WQQ0KQ29yYWwuVFAxLnBlcm08LWFkb25pczIodmVnZGlzdChDb3JhbC5sb2dfVFAxWyxjKDExOjE0LCAxNildLCAiZXVjbGlkZWFuIil+IENvcmFsLmxvZ19UUDEkT3JpZ2luICogQ29yYWwubG9nX1RQMSRTaXRlLCBkYXRhPUNvcmFsLmxvZ19UUDEsIHN0cmF0YT1Db3JhbC5sb2dfVFAxJEdlbm90eXBlLCBtZXRob2Q9ImV1Y2xpZGVhbiIpDQoNCiMjRWZmZWN0IFNpemUNCmFkb25pc19PbWVnYVNxKENvcmFsLlRQMS5wZXJtKQ0KDQojI0NoZWNrIGRpc3BlcnNpb24gYnkgT3JpZ2luDQphbm92YShiZXRhZGlzcGVyKHZlZ2Rpc3QoQ29yYWwubG9nX1RQMVssYygxMToxNCwgMTYpXSwgImV1Y2xpZGVhbiIpLCBDb3JhbC5sb2dfVFAxJE9yaWdpbikpDQoNCiMjQ2hlY2sgZGlzcGVyc2lvbiBieSBTaXRlDQphbm92YShiZXRhZGlzcGVyKHZlZ2Rpc3QoQ29yYWwubG9nX1RQMVssYygxMToxNCwgMTYpXSwgImV1Y2xpZGVhbiIpLCBDb3JhbC5sb2dfVFAxJFNpdGUpKQ0KDQojI0NoZWNrIGRpc3BlcnNpb24gYnkgT3JpZ2luOlNpdGUNCmFub3ZhKGJldGFkaXNwZXIodmVnZGlzdChDb3JhbC5sb2dfVFAxWyxjKDExOjE0LCAxNildLCAiZXVjbGlkZWFuIiksIENvcmFsLmxvZ19UUDEkT3JpZ2luOkNvcmFsLmxvZ19UUDEkU2l0ZSkpDQoNCmBgYA0KUGh5c2lvbG9neSBkaWZmZXJzIHNpZ25pZmljYW50bHkgYnkgT3JpZ2luIGFuZCB0aGUgZWZmZWN0IG9mIE9yaWdpbiBkaWZmZXJzIGJldHdlZW4gU2l0ZXMuDQoNCiMjIyMgRWZmZWN0IFNpemUNCkNhbGN1bGF0ZSBFZmZlY3QgU2l6ZSBvZiBPcmlnaW4gZm9yIGVhY2ggU2l0ZQ0KYGBge3J9DQojI0tMDQojI1BFUk1BTk9WQQ0KQ29yYWwuVFAxLnBlcm1fS0w8LWFkb25pczIodmVnZGlzdChDb3JhbC5sb2dfVFAxW3doaWNoKENvcmFsLmxvZ19UUDEkU2l0ZT09IktMIiksYygxMToxNCwgMTYpXSwgImV1Y2xpZGVhbiIpfiBDb3JhbC5sb2dfVFAxJE9yaWdpblt3aGljaChDb3JhbC5sb2dfVFAxJFNpdGU9PSJLTCIpXSwgZGF0YT1Db3JhbC5sb2dfVFAxW3doaWNoKENvcmFsLmxvZ19UUDEkU2l0ZT09IktMIiksXSwgc3RyYXRhPUNvcmFsLmxvZ19UUDEkR2Vub3R5cGVbd2hpY2goQ29yYWwubG9nX1RQMSRTaXRlPT0iS0wiKV0sIG1ldGhvZD0iZXVjbGlkZWFuIikNCg0KIyNFZmZlY3QgU2l6ZQ0KYWRvbmlzX09tZWdhU3EoQ29yYWwuVFAxLnBlcm1fS0wpDQoNCiMjQ2hlY2sgZGlzcGVyc2lvbiBieSBPcmlnaW4NCmFub3ZhKGJldGFkaXNwZXIodmVnZGlzdChDb3JhbC5sb2dfVFAxW3doaWNoKENvcmFsLmxvZ19UUDEkU2l0ZT09IktMIiksYygxMToxNCwgMTYpXSwgImV1Y2xpZGVhbiIpLCBDb3JhbC5sb2dfVFAxJE9yaWdpblt3aGljaChDb3JhbC5sb2dfVFAxJFNpdGU9PSJLTCIpXSkpDQoNCg0KIyNTUw0KIyNQRVJNQU5PVkENCkNvcmFsLlRQMS5wZXJtX1NTPC1hZG9uaXMyKHZlZ2Rpc3QoQ29yYWwubG9nX1RQMVt3aGljaChDb3JhbC5sb2dfVFAxJFNpdGU9PSJTUyIpLGMoMTE6MTQsIDE2KV0sICJldWNsaWRlYW4iKX4gQ29yYWwubG9nX1RQMSRPcmlnaW5bd2hpY2goQ29yYWwubG9nX1RQMSRTaXRlPT0iU1MiKV0sIGRhdGE9Q29yYWwubG9nX1RQMVt3aGljaChDb3JhbC5sb2dfVFAxJFNpdGU9PSJTUyIpLF0sIHN0cmF0YT1Db3JhbC5sb2dfVFAxJEdlbm90eXBlW3doaWNoKENvcmFsLmxvZ19UUDEkU2l0ZT09IlNTIildLCBtZXRob2Q9ImV1Y2xpZGVhbiIpDQoNCiMjRWZmZWN0IFNpemUNCmFkb25pc19PbWVnYVNxKENvcmFsLlRQMS5wZXJtX1NTKQ0KDQojI0NoZWNrIGRpc3BlcnNpb24gYnkgT3JpZ2luDQphbm92YShiZXRhZGlzcGVyKHZlZ2Rpc3QoQ29yYWwubG9nX1RQMVt3aGljaChDb3JhbC5sb2dfVFAxJFNpdGU9PSJTUyIpLGMoMTE6MTQsIDE2KV0sICJldWNsaWRlYW4iKSwgQ29yYWwubG9nX1RQMSRPcmlnaW5bd2hpY2goQ29yYWwubG9nX1RQMSRTaXRlPT0iU1MiKV0pKQ0KDQpgYGANCg0KDQojIyMjIFZhcmlhbmNlIFBhcnRpdGlvbmluZw0KYGBge3J9DQojI1ZhcmlhbmNlIFBhcnRpdGlvbmluZw0KQ29yYWwuVFAxLnZwPC12YXJwYXJ0KENvcmFsLmxvZ19UUDFbLGMoMTE6MTQsIDE2KV0sIENvcmFsLmxvZ19UUDEkT3JpZ2luLCBDb3JhbC5sb2dfVFAxJFNpdGUsIENvcmFsLmxvZ19UUDEkR2Vub3R5cGUpDQpDb3JhbC5UUDEudnAkcGFydA0KDQojI0NoZWNrIG1vZGVsIHNpZ25pZmljYW5jZQ0KYW5vdmEocmRhKENvcmFsLmxvZ19UUDFbLGMoMTE6MTQsIDE2KV1+IENvcmFsLmxvZ19UUDEkT3JpZ2luICsgQ29yYWwubG9nX1RQMSRTaXRlICsgQ29yYWwubG9nX1RQMSRHZW5vdHlwZSkpDQoNCiMjQ2hlY2sgdmFyaWFuY2UgZXhwbGFpbmVkIGJ5IG1vZGVsDQpSc3F1YXJlQWRqKHJkYShDb3JhbC5sb2dfVFAxWyxjKDExOjE0LCAxNildfiBDb3JhbC5sb2dfVFAxJE9yaWdpbiArIENvcmFsLmxvZ19UUDEkU2l0ZSArIENvcmFsLmxvZ19UUDEkR2Vub3R5cGUpKSRhZGouci5zcXVhcmVkKjEwMA0KDQojI0NoZWNrIGVmZmVjdCBvZiBPcmlnaW4gDQphbm92YShyZGEoQ29yYWwubG9nX1RQMVssYygxMToxNCwgMTYpXSwgQ29yYWwubG9nX1RQMSRPcmlnaW4pKQ0KYW5vdmEocmRhKENvcmFsLmxvZ19UUDFbLGMoMTE6MTQsIDE2KV0sIENvcmFsLmxvZ19UUDEkT3JpZ2luLCBDb3JhbC5sb2dfVFAxWyxjKDQ6NSldKSkNCg0KIyNDaGVjayBlZmZlY3Qgb2YgU2l0ZSANCmFub3ZhKHJkYShDb3JhbC5sb2dfVFAxWyxjKDExOjE0LCAxNildLCBDb3JhbC5sb2dfVFAxJFNpdGUpKQ0KYW5vdmEocmRhKENvcmFsLmxvZ19UUDFbLGMoMTE6MTQsIDE2KV0sIENvcmFsLmxvZ19UUDEkU2l0ZSwgQ29yYWwubG9nX1RQMVssYyg1LDcpXSkpDQoNCiMjQ2hlY2sgZWZmZWN0IG9mIEdlbm90eXBlIA0KYW5vdmEocmRhKENvcmFsLmxvZ19UUDFbLGMoMTE6MTQsIDE2KV0sIENvcmFsLmxvZ19UUDEkR2Vub3R5cGUpKQ0KYW5vdmEocmRhKENvcmFsLmxvZ19UUDFbLGMoMTE6MTQsIDE2KV0sIENvcmFsLmxvZ19UUDEkR2Vub3R5cGUsIENvcmFsLmxvZ19UUDFbLGMoNCw3KV0pKQ0KDQoNCmBgYA0KVGhlIG1vZGVsIGlzIHNpZ25pZmljYW50IChwID0gMC4wMDEpIGFuZCBleHBsYWlucyAzNS4xNCUgb2YgdGhlIHZhcmlhbmNlIG9mIHBoeXNpb2xvZ3kuIFRoZSBlZmZlY3Qgb2YgT3JpZ2luIChjb250cm9sbGluZyBmb3IgU2l0ZSBhbmQgR2Vub3R5cGUpIGlzIHNpZ25pZmljYW50IChwID0gMC4wMTMpIGFuZCBleHBsYWlucyAzLjkyJS4gVGhlIGVmZmVjdCBvZiBTaXRlIChjb250cm9sbGluZyBmb3IgT3JpZ2luIGFuZCBHZW5vdHlwZSkgaXMgc2lnbmlmaWNhbnQgKHAgPSAwLjAwMSkgYW5kIGV4cGxhaW5zIDUuNzMlLiBUaGUgZWZmZWN0IG9mIEdlbm90eXBlIChjb250cm9sbGluZyBmb3IgT3JpZ2luIGFuZCBTaXRlKSBpcyBzaWduaWZpY2FudCAocCA9IDAuMDAxKSBhbmQgZXhwbGFpbnMgMjcuMjclLiANCg0KDQojIyMgVFAyDQpgYGB7cn0NCiMjU3Vic2V0IFRpbWVwb2ludCAyIA0KQ29yYWwubG9nX1RQMjwtc3Vic2V0KENvcmFsLmxvZywgVGltZVA9PSJUUDIiKQ0KDQpgYGANCg0KIyMjIyBQRVJNQU5PVkENCmBgYHtyfQ0KIyNQRVJNQU5PVkENCkNvcmFsLlRQMi5wZXJtPC1hZG9uaXMyKHZlZ2Rpc3QoQ29yYWwubG9nX1RQMlssYygxMToxNCwgMTYpXSwgImV1Y2xpZGVhbiIpfiBDb3JhbC5sb2dfVFAyJE9yaWdpbiAqIENvcmFsLmxvZ19UUDIkU2l0ZSwgZGF0YT1Db3JhbC5sb2dfVFAyLCBzdHJhdGE9Q29yYWwubG9nX1RQMiRHZW5vdHlwZSwgbWV0aG9kPSJldWNsaWRlYW4iKQ0KDQojI0VmZmVjdCBTaXplDQphZG9uaXNfT21lZ2FTcShDb3JhbC5UUDIucGVybSkNCg0KIyNDaGVjayBkaXNwZXJzaW9uIGJ5IE9yaWdpbg0KYW5vdmEoYmV0YWRpc3Blcih2ZWdkaXN0KENvcmFsLmxvZ19UUDJbLGMoMTE6MTQsIDE2KV0sICJldWNsaWRlYW4iKSwgQ29yYWwubG9nX1RQMiRPcmlnaW4pKQ0KDQojI0NoZWNrIGRpc3BlcnNpb24gYnkgU2l0ZQ0KYW5vdmEoYmV0YWRpc3Blcih2ZWdkaXN0KENvcmFsLmxvZ19UUDJbLGMoMTE6MTQsIDE2KV0sICJldWNsaWRlYW4iKSwgQ29yYWwubG9nX1RQMiRTaXRlKSkNCg0KIyNDaGVjayBkaXNwZXJzaW9uIGJ5IE9yaWdpbjpTaXRlDQphbm92YShiZXRhZGlzcGVyKHZlZ2Rpc3QoQ29yYWwubG9nX1RQMlssYygxMToxNCwgMTYpXSwgImV1Y2xpZGVhbiIpLCBDb3JhbC5sb2dfVFAyJE9yaWdpbjpDb3JhbC5sb2dfVFAyJFNpdGUpKQ0KDQpgYGANCg0KDQojIyMjIEVmZmVjdCBTaXplDQpDYWxjdWxhdGUgRWZmZWN0IFNpemUgb2YgT3JpZ2luIGZvciBlYWNoIFNpdGUNCmBgYHtyfQ0KIyNLTA0KIyNQRVJNQU5PVkENCkNvcmFsLlRQMi5wZXJtX0tMPC1hZG9uaXMyKHZlZ2Rpc3QoQ29yYWwubG9nX1RQMlt3aGljaChDb3JhbC5sb2dfVFAyJFNpdGU9PSJLTCIpLGMoMTE6MTQsIDE2KV0sICJldWNsaWRlYW4iKX4gQ29yYWwubG9nX1RQMiRPcmlnaW5bd2hpY2goQ29yYWwubG9nX1RQMiRTaXRlPT0iS0wiKV0sIGRhdGE9Q29yYWwubG9nX1RQMlt3aGljaChDb3JhbC5sb2dfVFAyJFNpdGU9PSJLTCIpLF0sIHN0cmF0YT1Db3JhbC5sb2dfVFAyJEdlbm90eXBlW3doaWNoKENvcmFsLmxvZ19UUDIkU2l0ZT09IktMIildLCBtZXRob2Q9ImV1Y2xpZGVhbiIpDQoNCiMjRWZmZWN0IFNpemUNCmFkb25pc19PbWVnYVNxKENvcmFsLlRQMi5wZXJtX0tMKQ0KDQojI0NoZWNrIGRpc3BlcnNpb24gYnkgT3JpZ2luDQphbm92YShiZXRhZGlzcGVyKHZlZ2Rpc3QoQ29yYWwubG9nX1RQMlt3aGljaChDb3JhbC5sb2dfVFAyJFNpdGU9PSJLTCIpLGMoMTE6MTQsIDE2KV0sICJldWNsaWRlYW4iKSwgQ29yYWwubG9nX1RQMiRPcmlnaW5bd2hpY2goQ29yYWwubG9nX1RQMiRTaXRlPT0iS0wiKV0pKQ0KDQoNCiMjU1MNCiMjUEVSTUFOT1ZBDQpDb3JhbC5UUDIucGVybV9TUzwtYWRvbmlzMih2ZWdkaXN0KENvcmFsLmxvZ19UUDJbd2hpY2goQ29yYWwubG9nX1RQMiRTaXRlPT0iU1MiKSxjKDExOjE0LCAxNildLCAiZXVjbGlkZWFuIil+IENvcmFsLmxvZ19UUDIkT3JpZ2luW3doaWNoKENvcmFsLmxvZ19UUDIkU2l0ZT09IlNTIildLCBkYXRhPUNvcmFsLmxvZ19UUDJbd2hpY2goQ29yYWwubG9nX1RQMiRTaXRlPT0iU1MiKSxdLCBzdHJhdGE9Q29yYWwubG9nX1RQMiRHZW5vdHlwZVt3aGljaChDb3JhbC5sb2dfVFAyJFNpdGU9PSJTUyIpXSwgbWV0aG9kPSJldWNsaWRlYW4iKQ0KDQojI0VmZmVjdCBTaXplDQphZG9uaXNfT21lZ2FTcShDb3JhbC5UUDIucGVybV9TUykNCg0KIyNDaGVjayBkaXNwZXJzaW9uIGJ5IE9yaWdpbg0KYW5vdmEoYmV0YWRpc3Blcih2ZWdkaXN0KENvcmFsLmxvZ19UUDJbd2hpY2goQ29yYWwubG9nX1RQMiRTaXRlPT0iU1MiKSxjKDExOjE0LCAxNildLCAiZXVjbGlkZWFuIiksIENvcmFsLmxvZ19UUDIkT3JpZ2luW3doaWNoKENvcmFsLmxvZ19UUDIkU2l0ZT09IlNTIildKSkNCg0KYGBgDQoNCg0KIyMjIFRQMw0KYGBge3J9DQojI1N1YnNldCBUaW1lcG9pbnQgMyANCkNvcmFsLmxvZ19UUDM8LXN1YnNldChDb3JhbC5sb2csIFRpbWVQPT0iVFAzIikNCg0KYGBgDQoNCiMjIyMgUEVSTUFOT1ZBDQpgYGB7cn0NCiMjUEVSTUFOT1ZBDQpDb3JhbC5UUDMucGVybTwtYWRvbmlzMih2ZWdkaXN0KENvcmFsLmxvZ19UUDNbLGMoMTE6MTQsIDE2KV0sICJldWNsaWRlYW4iKX4gQ29yYWwubG9nX1RQMyRPcmlnaW4gKiBDb3JhbC5sb2dfVFAzJFNpdGUsIGRhdGE9Q29yYWwubG9nX1RQMywgc3RyYXRhPUNvcmFsLmxvZ19UUDMkR2Vub3R5cGUsIG1ldGhvZD0iZXVjbGlkZWFuIikNCg0KIyNFZmZlY3QgU2l6ZQ0KYWRvbmlzX09tZWdhU3EoQ29yYWwuVFAzLnBlcm0pDQoNCiMjQ2hlY2sgZGlzcGVyc2lvbiBieSBPcmlnaW4NCmFub3ZhKGJldGFkaXNwZXIodmVnZGlzdChDb3JhbC5sb2dfVFAzWyxjKDExOjE0LCAxNildLCAiZXVjbGlkZWFuIiksIENvcmFsLmxvZ19UUDMkT3JpZ2luKSkNCg0KIyNDaGVjayBkaXNwZXJzaW9uIGJ5IFNpdGUNCmFub3ZhKGJldGFkaXNwZXIodmVnZGlzdChDb3JhbC5sb2dfVFAzWyxjKDExOjE0LCAxNildLCAiZXVjbGlkZWFuIiksIENvcmFsLmxvZ19UUDMkU2l0ZSkpDQoNCiMjQ2hlY2sgZGlzcGVyc2lvbiBieSBPcmlnaW46U2l0ZQ0KYW5vdmEoYmV0YWRpc3Blcih2ZWdkaXN0KENvcmFsLmxvZ19UUDNbLGMoMTE6MTQsIDE2KV0sICJldWNsaWRlYW4iKSwgQ29yYWwubG9nX1RQMyRPcmlnaW46Q29yYWwubG9nX1RQMyRTaXRlKSkNCg0KYGBgDQoNCg0KIyMjIyBFZmZlY3QgU2l6ZQ0KQ2FsY3VsYXRlIEVmZmVjdCBTaXplIG9mIE9yaWdpbiBmb3IgZWFjaCBTaXRlDQpgYGB7cn0NCiMjS0wNCiMjUEVSTUFOT1ZBDQpDb3JhbC5UUDMucGVybV9LTDwtYWRvbmlzMih2ZWdkaXN0KENvcmFsLmxvZ19UUDNbd2hpY2goQ29yYWwubG9nX1RQMyRTaXRlPT0iS0wiKSxjKDExOjE0LCAxNildLCAiZXVjbGlkZWFuIil+IENvcmFsLmxvZ19UUDMkT3JpZ2luW3doaWNoKENvcmFsLmxvZ19UUDMkU2l0ZT09IktMIildLCBkYXRhPUNvcmFsLmxvZ19UUDNbd2hpY2goQ29yYWwubG9nX1RQMyRTaXRlPT0iS0wiKSxdLCBzdHJhdGE9Q29yYWwubG9nX1RQMyRHZW5vdHlwZVt3aGljaChDb3JhbC5sb2dfVFAzJFNpdGU9PSJLTCIpXSwgbWV0aG9kPSJldWNsaWRlYW4iKQ0KDQojI0VmZmVjdCBTaXplDQphZG9uaXNfT21lZ2FTcShDb3JhbC5UUDMucGVybV9LTCkNCg0KIyNDaGVjayBkaXNwZXJzaW9uIGJ5IE9yaWdpbg0KYW5vdmEoYmV0YWRpc3Blcih2ZWdkaXN0KENvcmFsLmxvZ19UUDNbd2hpY2goQ29yYWwubG9nX1RQMyRTaXRlPT0iS0wiKSxjKDExOjE0LCAxNildLCAiZXVjbGlkZWFuIiksIENvcmFsLmxvZ19UUDMkT3JpZ2luW3doaWNoKENvcmFsLmxvZ19UUDMkU2l0ZT09IktMIildKSkNCg0KDQojI1NTDQojI1BFUk1BTk9WQQ0KQ29yYWwuVFAzLnBlcm1fU1M8LWFkb25pczIodmVnZGlzdChDb3JhbC5sb2dfVFAzW3doaWNoKENvcmFsLmxvZ19UUDMkU2l0ZT09IlNTIiksYygxMToxNCwgMTYpXSwgImV1Y2xpZGVhbiIpfiBDb3JhbC5sb2dfVFAzJE9yaWdpblt3aGljaChDb3JhbC5sb2dfVFAzJFNpdGU9PSJTUyIpXSwgZGF0YT1Db3JhbC5sb2dfVFAzW3doaWNoKENvcmFsLmxvZ19UUDMkU2l0ZT09IlNTIiksXSwgc3RyYXRhPUNvcmFsLmxvZ19UUDMkR2Vub3R5cGVbd2hpY2goQ29yYWwubG9nX1RQMyRTaXRlPT0iU1MiKV0sIG1ldGhvZD0iZXVjbGlkZWFuIikNCg0KIyNFZmZlY3QgU2l6ZQ0KYWRvbmlzX09tZWdhU3EoQ29yYWwuVFAzLnBlcm1fU1MpDQoNCiMjQ2hlY2sgZGlzcGVyc2lvbiBieSBPcmlnaW4NCmFub3ZhKGJldGFkaXNwZXIodmVnZGlzdChDb3JhbC5sb2dfVFAzW3doaWNoKENvcmFsLmxvZ19UUDMkU2l0ZT09IlNTIiksYygxMToxNCwgMTYpXSwgImV1Y2xpZGVhbiIpLCBDb3JhbC5sb2dfVFAzJE9yaWdpblt3aGljaChDb3JhbC5sb2dfVFAzJFNpdGU9PSJTUyIpXSkpDQoNCg0KYGBgDQoNCg0KIyMjIFRQNA0KYGBge3J9DQojI1N1YnNldCBUaW1lcG9pbnQgNCANCkNvcmFsLmxvZ19UUDQ8LXN1YnNldChDb3JhbC5sb2csIFRpbWVQPT0iVFA0IikNCg0KYGBgDQoNCiMjIyMgUEVSTUFOT1ZBDQpgYGB7cn0NCiMjUEVSTUFOT1ZBDQpDb3JhbC5UUDQucGVybTwtYWRvbmlzMih2ZWdkaXN0KENvcmFsLmxvZ19UUDRbLGMoMTE6MTQsIDE2KV0sICJldWNsaWRlYW4iKX4gQ29yYWwubG9nX1RQNCRPcmlnaW4gKiBDb3JhbC5sb2dfVFA0JFNpdGUsIGRhdGE9Q29yYWwubG9nX1RQNCwgc3RyYXRhPUNvcmFsLmxvZ19UUDQkR2Vub3R5cGUsIG1ldGhvZD0iZXVjbGlkZWFuIikNCg0KIyNFZmZlY3QgU2l6ZQ0KYWRvbmlzX09tZWdhU3EoQ29yYWwuVFA0LnBlcm0pDQoNCiMjQ2hlY2sgZGlzcGVyc2lvbiBieSBPcmlnaW4NCmFub3ZhKGJldGFkaXNwZXIodmVnZGlzdChDb3JhbC5sb2dfVFA0WyxjKDExOjE0LCAxNildLCAiZXVjbGlkZWFuIiksIENvcmFsLmxvZ19UUDQkT3JpZ2luKSkNCg0KIyNDaGVjayBkaXNwZXJzaW9uIGJ5IFNpdGUNCmFub3ZhKGJldGFkaXNwZXIodmVnZGlzdChDb3JhbC5sb2dfVFA0WyxjKDExOjE0LCAxNildLCAiZXVjbGlkZWFuIiksIENvcmFsLmxvZ19UUDQkU2l0ZSkpDQoNCiMjQ2hlY2sgZGlzcGVyc2lvbiBieSBPcmlnaW46U2l0ZQ0KYW5vdmEoYmV0YWRpc3Blcih2ZWdkaXN0KENvcmFsLmxvZ19UUDRbLGMoMTE6MTQsIDE2KV0sICJldWNsaWRlYW4iKSwgQ29yYWwubG9nX1RQNCRPcmlnaW46Q29yYWwubG9nX1RQNCRTaXRlKSkNCg0KYGBgDQoNCg0KIyMjIyBFZmZlY3QgU2l6ZQ0KQ2FsY3VsYXRlIEVmZmVjdCBTaXplIG9mIE9yaWdpbiBmb3IgZWFjaCBTaXRlDQpgYGB7cn0NCiMjS0wNCiMjUEVSTUFOT1ZBDQpDb3JhbC5UUDQucGVybV9LTDwtYWRvbmlzMih2ZWdkaXN0KENvcmFsLmxvZ19UUDRbd2hpY2goQ29yYWwubG9nX1RQNCRTaXRlPT0iS0wiKSxjKDExOjE0LCAxNildLCAiZXVjbGlkZWFuIil+IENvcmFsLmxvZ19UUDQkT3JpZ2luW3doaWNoKENvcmFsLmxvZ19UUDQkU2l0ZT09IktMIildLCBkYXRhPUNvcmFsLmxvZ19UUDRbd2hpY2goQ29yYWwubG9nX1RQNCRTaXRlPT0iS0wiKSxdLCBzdHJhdGE9Q29yYWwubG9nX1RQNCRHZW5vdHlwZVt3aGljaChDb3JhbC5sb2dfVFA0JFNpdGU9PSJLTCIpXSwgbWV0aG9kPSJldWNsaWRlYW4iKQ0KDQojI0VmZmVjdCBTaXplDQphZG9uaXNfT21lZ2FTcShDb3JhbC5UUDQucGVybV9LTCkNCg0KIyNDaGVjayBkaXNwZXJzaW9uIGJ5IE9yaWdpbg0KYW5vdmEoYmV0YWRpc3Blcih2ZWdkaXN0KENvcmFsLmxvZ19UUDRbd2hpY2goQ29yYWwubG9nX1RQNCRTaXRlPT0iS0wiKSxjKDExOjE0LCAxNildLCAiZXVjbGlkZWFuIiksIENvcmFsLmxvZ19UUDQkT3JpZ2luW3doaWNoKENvcmFsLmxvZ19UUDQkU2l0ZT09IktMIildKSkNCg0KDQojI1NTDQojI1BFUk1BTk9WQQ0KQ29yYWwuVFA0LnBlcm1fU1M8LWFkb25pczIodmVnZGlzdChDb3JhbC5sb2dfVFA0W3doaWNoKENvcmFsLmxvZ19UUDQkU2l0ZT09IlNTIiksYygxMToxNCwgMTYpXSwgImV1Y2xpZGVhbiIpfiBDb3JhbC5sb2dfVFA0JE9yaWdpblt3aGljaChDb3JhbC5sb2dfVFA0JFNpdGU9PSJTUyIpXSwgZGF0YT1Db3JhbC5sb2dfVFA0W3doaWNoKENvcmFsLmxvZ19UUDQkU2l0ZT09IlNTIiksXSwgc3RyYXRhPUNvcmFsLmxvZ19UUDQkR2Vub3R5cGVbd2hpY2goQ29yYWwubG9nX1RQNCRTaXRlPT0iU1MiKV0sIG1ldGhvZD0iZXVjbGlkZWFuIikNCg0KIyNFZmZlY3QgU2l6ZQ0KYWRvbmlzX09tZWdhU3EoQ29yYWwuVFA0LnBlcm1fU1MpDQoNCiMjQ2hlY2sgZGlzcGVyc2lvbiBieSBPcmlnaW4NCmFub3ZhKGJldGFkaXNwZXIodmVnZGlzdChDb3JhbC5sb2dfVFA0W3doaWNoKENvcmFsLmxvZ19UUDQkU2l0ZT09IlNTIiksYygxMToxNCwgMTYpXSwgImV1Y2xpZGVhbiIpLCBDb3JhbC5sb2dfVFA0JE9yaWdpblt3aGljaChDb3JhbC5sb2dfVFA0JFNpdGU9PSJTUyIpXSkpDQoNCmBgYA0KDQoNCiMgVW5pdmFyaWF0ZSANCg0KIyMjIFRQMQ0KDQpgYGB7cn0NCiMjU3Vic2V0IFRpbWVwb2ludCAxIA0KQ29yYWwuVFAxPC1zdWJzZXQoQ29yYWwucm0sIFRpbWVQPT0iVFAxIikNCg0KYGBgDQoNCg0KIyMjIyBQcm90ZWluIEhvc3QgDQpgYGB7cn0NCiMjQ2hlY2sgbm9ybWFsaXR5DQpoaXN0KENvcmFsLlRQMSRUUF91Zy5jbTJfQykNCnNoYXBpcm8udGVzdChDb3JhbC5UUDEkVFBfdWcuY20yX0MpDQojTm9ybWFsDQoNCiMjTW9kZWwgDQojRnVuY3Rpb24gb2YgU2l0ZSBhbmQgT3JpZ2luLCB3aXRoIEdlbm90eXBlIGFzIGEgUmFuZG9tIGVmZmVjdA0KI0ludGVyYWN0aW9ucyBiZXR3ZWVuIE9yaWdpbiBhbmQgU2l0ZQ0KUHJvdC5DLmxtZV9UUDE8LWxtZXIoVFBfdWcuY20yX0N+T3JpZ2luKlNpdGUrKDF8R2Vub3R5cGUpLCBkYXRhPUNvcmFsLlRQMSkNCg0KIyNDaGVjayByZXNpZHVhbHMNClByb3QuQy5sbWVfcmVzX1RQMSA8LSBzaW11bGF0ZVJlc2lkdWFscyhmaXR0ZWRNb2RlbCA9IFByb3QuQy5sbWVfVFAxLCBwbG90ID0gRikNCnBsb3QoUHJvdC5DLmxtZV9yZXNfVFAxKQ0KDQojI01vZGVsIHJlc3VsdHMNCnN1bW1hcnkoUHJvdC5DLmxtZV9UUDEpDQoNCmV0YV9zcXVhcmVkKFByb3QuQy5sbWVfVFAxKQ0KDQpgYGANCg0KDQojIyMjIFByb3RlaW4gU3ltYmlvbnQgDQpgYGB7cn0NCiMjQ2hlY2sgbm9ybWFsaXR5DQpoaXN0KENvcmFsLlRQMSRUUF91Zy5jbTJfUykNCnNoYXBpcm8udGVzdChDb3JhbC5UUDEkVFBfdWcuY20yX1MpDQojTm9ybWFsDQoNCiMjTW9kZWwNCiNGdW5jdGlvbiBvZiBTaXRlIGFuZCBPcmlnaW4sIHdpdGggR2Vub3R5cGUgYXMgYSBSYW5kb20gZWZmZWN0DQojSW50ZXJhY3Rpb25zIGJldHdlZW4gT3JpZ2luIGFuZCBTaXRlDQpQcm90LlMubG1lX1RQMTwtbG1lcihUUF91Zy5jbTJfU35PcmlnaW4qU2l0ZSsoMXxHZW5vdHlwZSksIGRhdGE9Q29yYWwuVFAxKQ0KDQojI0NoZWNrIHJlc2lkdWFscw0KUHJvdC5TLmxtZV9yZXNfVFAxIDwtIHNpbXVsYXRlUmVzaWR1YWxzKGZpdHRlZE1vZGVsID0gUHJvdC5TLmxtZV9UUDEsIHBsb3QgPSBGKQ0KcGxvdChQcm90LlMubG1lX3Jlc19UUDEpDQoNCiMjTW9kZWwgcmVzdWx0cw0Kc3VtbWFyeShQcm90LlMubG1lX1RQMSkNCg0KZXRhX3NxdWFyZWQoUHJvdC5TLmxtZV9UUDEpDQoNCmBgYA0KDQpFZmZlY3Qgc2l6ZSBvZiBPcmlnaW4gZm9yIGVhY2ggU2l0ZQ0KYGBge3J9DQojI0tMDQpQcm90LlMubG1lX1RQMV9LTDwtbG1lcihUUF91Zy5jbTJfU35PcmlnaW4rKDF8R2Vub3R5cGUpLCBkYXRhPUNvcmFsLlRQMVt3aGljaChDb3JhbC5UUDEkU2l0ZT09IktMIiksXSkNCnN1bW1hcnkoUHJvdC5TLmxtZV9UUDFfS0wpDQpldGFfc3F1YXJlZChQcm90LlMubG1lX1RQMV9LTCkNCg0KDQojI1NTDQpQcm90LlMubG1lX1RQMV9TUzwtbG1lcihUUF91Zy5jbTJfU35PcmlnaW4rKDF8R2Vub3R5cGUpLCBkYXRhPUNvcmFsLlRQMVt3aGljaChDb3JhbC5UUDEkU2l0ZT09IlNTIiksXSkNCnN1bW1hcnkoUHJvdC5TLmxtZV9UUDFfU1MpDQpldGFfc3F1YXJlZChQcm90LlMubG1lX1RQMV9TUykNCg0KYGBgDQoNCg0KDQpgYGB7ciBQbG90IFByb3RlaW4gU3ltYmlvbnQgVFAxfQ0KIyNTdW1tYXJ5IHN0YXRpc3RpY3MgYnkgU2l0ZSBhbmQgT3JpZ2luDQpUUDFfUHJvdFN5bS5zdW08LXN1bW1hcnlTRShDb3JhbC5UUDEsIG1lYXN1cmV2YXI9IlRQX3VnLmNtMl9TIiwgZ3JvdXB2YXJzPWMoIlNpdGUiLCAiT3JpZ2luIiwgIlNpdGUuT3JpZyIpLCBuYS5ybT1UUlVFKQ0KDQojI1Bsb3QgQXZlcmFnZSBTeW1iaW9udCBQcm90ZWluIGFjcm9zcyBUcmVhdG1lbnRzDQpUUDFfUHJvdFN5bS5wbG90PC1nZ3Bsb3QoVFAxX1Byb3RTeW0uc3VtLCBhZXMoeD1TaXRlLCB5PVRQX3VnLmNtMl9TLCBjb2xvdXI9U2l0ZS5PcmlnKSkgKyANCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9T3JpZy5jb2xvcnMubykrDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49VFBfdWcuY20yX1Mtc2UsIHltYXg9VFBfdWcuY20yX1Mrc2UpLCB3aWR0aD1jYXAuc3osIGxpbmV3aWR0aD1iYXIuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpICsNCiAgZ2VvbV9wb2ludChzaXplPXBvaW50LnN6LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCANCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgDQogICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPWxlZy50eHQuc3opLCBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9bGVnLnRpdGxlLnN6KSwgDQogICAgICAgIGxlZ2VuZC5ib3guYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9ICJibGFjayIpKSsNCiAgbGFicyh4PSJTaXRlIGFuZCBPcmlnaW4iLCB5PWV4cHJlc3Npb24ocGFzdGUoJ1N5bWJpb250IFByb3RlaW4gKFx1MDNCQ2cgY20nXi0yKiIpIikpLCBjb2xvdXI9Ik9yaWdpbiIpKw0KICB5bGltKDM1MCwgNTUwKSsNCiAgYW5ub3RhdGUoInRleHQiLCB4PTIsIHk9NTM1LCBsYWJlbD0iKioiLCBzaXplPXNpZy5zeiwgZm9udGZhY2U9ImJvbGQiKTsgVFAxX1Byb3RTeW0ucGxvdA0KYGBgDQoNCg0KIyMjIyBCaW9tYXNzIEhvc3QgDQpgYGB7cn0NCiMjQ2hlY2sgbm9ybWFsaXR5DQpoaXN0KENvcmFsLlRQMSRBRkRXX21nLmNtMl9DKQ0Kc2hhcGlyby50ZXN0KENvcmFsLlRQMSRBRkRXX21nLmNtMl9DKQ0KI05vcm1hbA0KDQojI01vZGVsDQojRnVuY3Rpb24gb2YgU2l0ZSBhbmQgT3JpZ2luLCB3aXRoIEdlbm90eXBlIGFzIGEgUmFuZG9tIGVmZmVjdA0KI0ludGVyYWN0aW9ucyBiZXR3ZWVuIE9yaWdpbiBhbmQgU2l0ZQ0KQmlvLkMubG1lX1RQMTwtbG1lcihBRkRXX21nLmNtMl9Dfk9yaWdpbipTaXRlKygxfEdlbm90eXBlKSwgZGF0YT1Db3JhbC5UUDEpDQoNCiMjQ2hlY2sgcmVzaWR1YWxzDQpCaW8uQy5sbWVfcmVzX1RQMSA8LSBzaW11bGF0ZVJlc2lkdWFscyhmaXR0ZWRNb2RlbCA9IEJpby5DLmxtZV9UUDEsIHBsb3QgPSBGKQ0KcGxvdChCaW8uQy5sbWVfcmVzX1RQMSkNCg0KIyNNb2RlbCByZXN1bHRzDQpzdW1tYXJ5KEJpby5DLmxtZV9UUDEpDQoNCmV0YV9zcXVhcmVkKEJpby5DLmxtZV9UUDEpDQoNCmBgYA0KDQoNCkVmZmVjdCBzaXplIG9mIE9yaWdpbiBmb3IgZWFjaCBTaXRlDQpgYGB7cn0NCiMjS0wNCkJpby5DLmxtZV9UUDFfS0w8LWxtZXIoQUZEV19tZy5jbTJfQ35PcmlnaW4rKDF8R2Vub3R5cGUpLCBkYXRhPUNvcmFsLlRQMVt3aGljaChDb3JhbC5UUDEkU2l0ZT09IktMIiksXSkNCnN1bW1hcnkoQmlvLkMubG1lX1RQMV9LTCkNCmV0YV9zcXVhcmVkKEJpby5DLmxtZV9UUDFfS0wpDQoNCiMjU1MNCkJpby5DLmxtZV9UUDFfU1M8LWxtZXIoQUZEV19tZy5jbTJfQ35PcmlnaW4rKDF8R2Vub3R5cGUpLCBkYXRhPUNvcmFsLlRQMVt3aGljaChDb3JhbC5UUDEkU2l0ZT09IlNTIiksXSkNCnN1bW1hcnkoQmlvLkMubG1lX1RQMV9TUykNCmV0YV9zcXVhcmVkKEJpby5DLmxtZV9UUDFfU1MpDQoNCmBgYA0KDQoNCmBgYHtyIFBsb3QgQmlvbWFzcyBIb3N0IFRQMX0NCiMjU3VtbWFyeSBzdGF0aXN0aWNzIGJ5IFNpdGUgYW5kIE9yaWdpbg0KVFAxX0Jpb0hvc3Quc3VtPC1zdW1tYXJ5U0UoQ29yYWwuVFAxLCBtZWFzdXJldmFyPSJBRkRXX21nLmNtMl9DIiwgZ3JvdXB2YXJzPWMoIlNpdGUiLCAiT3JpZ2luIiwgIlNpdGUuT3JpZyIpLCBuYS5ybT1UUlVFKQ0KDQojI1Bsb3QgQXZlcmFnZSBIb3N0IEJpb21hc3MgYWNyb3NzIFRyZWF0bWVudHMNClRQMV9CaW9Ib3N0LnBsb3Q8LWdncGxvdChUUDFfQmlvSG9zdC5zdW0sIGFlcyh4PVNpdGUsIHk9QUZEV19tZy5jbTJfQywgY29sb3VyPVNpdGUuT3JpZykpICsgDQogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPU9yaWcuY29sb3JzLm8pKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUFGRFdfbWcuY20yX0Mtc2UsIHltYXg9QUZEV19tZy5jbTJfQytzZSksIHdpZHRoPWNhcC5zeiwgbGluZXdpZHRoPWJhci5zeiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC41KSkgKw0KICBnZW9tX3BvaW50KHNpemU9cG9pbnQuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCANCiAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9bGVnLnR4dC5zeiksIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT1sZWcudGl0bGUuc3opLCANCiAgICAgICAgbGVnZW5kLmJveC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yID0gImJsYWNrIikpKw0KICBsYWJzKHg9IlNpdGUgYW5kIE9yaWdpbiIsIHk9ZXhwcmVzc2lvbihwYXN0ZSgnSG9zdCBCaW9tYXNzIChtZyBjbSdeLTIqIikiKSksIGNvbG91cj0iT3JpZ2luIikrDQogIHlsaW0oMCwgMikrDQogICBhbm5vdGF0ZSgidGV4dCIsIHg9MSwgeT0xLjUsIGxhYmVsPSIqIiwgc2l6ZT1zaWcuc3osIGZvbnRmYWNlPSJib2xkIik7IFRQMV9CaW9Ib3N0LnBsb3QNCmBgYA0KDQoNCg0KIyMjIyBCaW9tYXNzIFN5bWJpb250cyANCmBgYHtyfQ0KIyNDaGVjayBub3JtYWxpdHkNCmhpc3QoQ29yYWwuVFAxJEFGRFdfbWcuY20yX1MpDQpzaGFwaXJvLnRlc3QoQ29yYWwuVFAxJEFGRFdfbWcuY20yX1MpDQojTm9ybWFsDQoNCiMjTW9kZWwgDQojRnVuY3Rpb24gb2YgU2l0ZSBhbmQgT3JpZ2luLCB3aXRoIEdlbm90eXBlIGFzIGEgUmFuZG9tIGVmZmVjdA0KI0ludGVyYWN0aW9ucyBiZXR3ZWVuIE9yaWdpbiBhbmQgU2l0ZQ0KQmlvLlMubG1lX1RQMTwtbG1lcihBRkRXX21nLmNtMl9Tfk9yaWdpbipTaXRlKygxfEdlbm90eXBlKSwgZGF0YT1Db3JhbC5UUDEpDQoNCiMjQ2hlY2sgcmVzaWR1YWxzDQpCaW8uUy5sbWVfcmVzX1RQMSA8LSBzaW11bGF0ZVJlc2lkdWFscyhmaXR0ZWRNb2RlbCA9IEJpby5TLmxtZV9UUDEsIHBsb3QgPSBGKQ0KcGxvdChCaW8uUy5sbWVfcmVzX1RQMSkNCg0KIyNNb2RlbCByZXN1bHRzDQpzdW1tYXJ5KEJpby5TLmxtZV9UUDEpDQoNCmV0YV9zcXVhcmVkKEJpby5TLmxtZV9UUDEpDQoNCmBgYA0KDQoNCkVmZmVjdCBzaXplIG9mIE9yaWdpbiBmb3IgZWFjaCBTaXRlDQpgYGB7cn0NCiMjS0wNCkJpby5TLmxtZV9UUDFfS0w8LWxtZXIoQUZEV19tZy5jbTJfU35PcmlnaW4rKDF8R2Vub3R5cGUpLCBkYXRhPUNvcmFsLlRQMVt3aGljaChDb3JhbC5UUDEkU2l0ZT09IktMIiksXSkNCnN1bW1hcnkoQmlvLlMubG1lX1RQMV9LTCkNCmV0YV9zcXVhcmVkKEJpby5TLmxtZV9UUDFfS0wpDQoNCg0KIyNTUw0KQmlvLlMubG1lX1RQMV9TUzwtbG1lcihBRkRXX21nLmNtMl9Tfk9yaWdpbisoMXxHZW5vdHlwZSksIGRhdGE9Q29yYWwuVFAxW3doaWNoKENvcmFsLlRQMSRTaXRlPT0iU1MiKSxdKQ0Kc3VtbWFyeShCaW8uUy5sbWVfVFAxX1NTKQ0KZXRhX3NxdWFyZWQoQmlvLlMubG1lX1RQMV9TUykNCg0KYGBgDQoNCg0KYGBge3IgUGxvdCBCaW9tYXNzIFN5bWJpb250IFRQMX0NCiMjU3VtbWFyeSBzdGF0aXN0aWNzIGJ5IFNpdGUgYW5kIE9yaWdpbg0KVFAxX0Jpb1N5bS5zdW08LXN1bW1hcnlTRShDb3JhbC5UUDEsIG1lYXN1cmV2YXI9IkFGRFdfbWcuY20yX1MiLCBncm91cHZhcnM9YygiU2l0ZSIsICJPcmlnaW4iLCAiU2l0ZS5PcmlnIiksIG5hLnJtPVRSVUUpDQoNCiMjUGxvdCBBdmVyYWdlIFN5bWJpb250IEJpb21hc3MgYWNyb3NzIFRyZWF0bWVudHMNClRQMV9CaW9TeW0ucGxvdDwtZ2dwbG90KFRQMV9CaW9TeW0uc3VtLCBhZXMoeD1TaXRlLCB5PUFGRFdfbWcuY20yX1MsIGNvbG91cj1TaXRlLk9yaWcpKSArIA0KICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1PcmlnLmNvbG9ycy5vKSsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1BRkRXX21nLmNtMl9TLXNlLCB5bWF4PUFGRFdfbWcuY20yX1Mrc2UpLCB3aWR0aD1jYXAuc3osIGxpbmV3aWR0aD1iYXIuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpICsNCiAgZ2VvbV9wb2ludChzaXplPXBvaW50LnN6LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCANCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgDQogICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPWxlZy50eHQuc3opLCBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9bGVnLnRpdGxlLnN6KSwgDQogICAgICAgIGxlZ2VuZC5ib3guYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9ICJibGFjayIpKSsNCiAgbGFicyh4PSJTaXRlIGFuZCBPcmlnaW4iLCB5PWV4cHJlc3Npb24ocGFzdGUoJ1N5bWJpb250IEJpb21hc3MgKG1nIGNtJ14tMioiKSIpKSwgY29sb3VyPSJPcmlnaW4iKSsNCiAgeWxpbSgwLCAxKSsNCiAgYW5ub3RhdGUoInRleHQiLCB4PTIsIHk9MC44NSwgbGFiZWw9IioqIiwgc2l6ZT1zaWcuc3osIGZvbnRmYWNlPSJib2xkIik7IFRQMV9CaW9TeW0ucGxvdA0KYGBgDQoNCg0KIyMjIyBDaGxvcm9waHlsbA0KYGBge3J9DQojI0NoZWNrIG5vcm1hbGl0eQ0KaGlzdChDb3JhbC5UUDEkQ2hsX3VnLmNtMikNCnNoYXBpcm8udGVzdChDb3JhbC5UUDEkQ2hsX3VnLmNtMikNCiNOb3JtYWwNCg0KIyNNb2RlbA0KI0Z1bmN0aW9uIG9mIFNpdGUgYW5kIE9yaWdpbiwgd2l0aCBHZW5vdHlwZSBhcyBhIFJhbmRvbSBlZmZlY3QNCiNJbnRlcmFjdGlvbnMgYmV0d2VlbiBPcmlnaW4gYW5kIFNpdGUNCkNobC5sbWVfVFAxPC1sbWVyKENobF91Zy5jbTJ+T3JpZ2luKlNpdGUrKDF8R2Vub3R5cGUpLCBkYXRhPUNvcmFsLlRQMSkNCg0KIyNDaGVjayByZXNpZHVhbHMNCkNobC5sbWVfcmVzX1RQMSA8LSBzaW11bGF0ZVJlc2lkdWFscyhmaXR0ZWRNb2RlbCA9IENobC5sbWVfVFAxLCBwbG90ID0gRikNCnBsb3QoQ2hsLmxtZV9yZXNfVFAxKQ0KDQojI01vZGVsIHJlc3VsdHMNCnN1bW1hcnkoQ2hsLmxtZV9UUDEpDQoNCmV0YV9zcXVhcmVkKENobC5sbWVfVFAxKQ0KDQpgYGANCg0KDQpFZmZlY3Qgc2l6ZSBvZiBPcmlnaW4gZm9yIGVhY2ggU2l0ZQ0KYGBge3J9DQojI0tMDQpDaGwubG1lX1RQMV9LTDwtbG1lcihDaGxfdWcuY20yfk9yaWdpbisoMXxHZW5vdHlwZSksIGRhdGE9Q29yYWwuVFAxW3doaWNoKENvcmFsLlRQMSRTaXRlPT0iS0wiKSxdKQ0Kc3VtbWFyeShDaGwubG1lX1RQMV9LTCkNCmV0YV9zcXVhcmVkKENobC5sbWVfVFAxX0tMKQ0KDQojI1NTDQpDaGwubG1lX1RQMV9TUzwtbG1lcihDaGxfdWcuY20yfk9yaWdpbisoMXxHZW5vdHlwZSksIGRhdGE9Q29yYWwuVFAxW3doaWNoKENvcmFsLlRQMSRTaXRlPT0iU1MiKSxdKQ0Kc3VtbWFyeShDaGwubG1lX1RQMV9TUykNCmV0YV9zcXVhcmVkKENobC5sbWVfVFAxX1NTKQ0KDQpgYGANCg0KDQpgYGB7ciBQbG90IENobG9yb3BoeWxsIFRQMX0NCiMjU3VtbWFyeSBzdGF0aXN0aWNzIGJ5IFNpdGUgYW5kIE9yaWdpbg0KVFAxX0NobC5zdW08LXN1bW1hcnlTRShDb3JhbC5UUDEsIG1lYXN1cmV2YXI9IkNobF91Zy5jbTIiLCBncm91cHZhcnM9YygiU2l0ZSIsICJPcmlnaW4iLCAiU2l0ZS5PcmlnIiksIG5hLnJtPVRSVUUpDQoNCiMjUGxvdCBBdmVyYWdlIENobG9yb3BoeWxsIGFjcm9zcyBUcmVhdG1lbnRzDQpUUDFfQ2hsLnBsb3Q8LWdncGxvdChUUDFfQ2hsLnN1bSwgYWVzKHg9U2l0ZSwgeT1DaGxfdWcuY20yLCBjb2xvdXI9U2l0ZS5PcmlnKSkgKyANCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9T3JpZy5jb2xvcnMubykrDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49Q2hsX3VnLmNtMi1zZSwgeW1heD1DaGxfdWcuY20yK3NlKSwgd2lkdGg9Y2FwLnN6LCBsaW5ld2lkdGg9YmFyLnN6LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpKSArDQogIGdlb21fcG9pbnQoc2l6ZT1wb2ludC5zeiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC41KSkrDQogIHRoZW1lX2NsYXNzaWMoKSsNCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgDQogICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIA0KICAgICAgICBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT1sZWcudHh0LnN6KSwgbGVnZW5kLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPWxlZy50aXRsZS5zeiksIA0KICAgICAgICBsZWdlbmQuYm94LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3IgPSAiYmxhY2siKSkrDQogIGxhYnMoeD0iU2l0ZSBhbmQgT3JpZ2luIiwgeT1leHByZXNzaW9uKHBhc3RlKCdUb3RhbCBDaGxvcm9waHlsbCAoXHUwM0JDZyBjbSdeLTIqIikiKSksIGNvbG91cj0iT3JpZ2luIikrDQogIHlsaW0oMCwgMikrDQogIGFubm90YXRlKCJ0ZXh0IiwgeD0yLCB5PTEuNywgbGFiZWw9IioqKiIsIHNpemU9c2lnLnN6LCBmb250ZmFjZT0iYm9sZCIpOyBUUDFfQ2hsLnBsb3QNCmBgYA0KDQoNCiMjIyBUUDINCg0KYGBge3J9DQojI1N1YnNldCBUaW1lcG9pbnQgMiANCkNvcmFsLlRQMjwtc3Vic2V0KENvcmFsLnJtLCBUaW1lUD09IlRQMiIpDQoNCmBgYA0KDQoNCiMjIyMgUHJvdGVpbiBIb3N0IA0KYGBge3J9DQojI0NoZWNrIG5vcm1hbGl0eQ0KaGlzdChDb3JhbC5UUDIkVFBfdWcuY20yX0MpDQpzaGFwaXJvLnRlc3QoQ29yYWwuVFAyJFRQX3VnLmNtMl9DKQ0KI05vcm1hbA0KDQojI01vZGVsIA0KI0Z1bmN0aW9uIG9mIFNpdGUgYW5kIE9yaWdpbiwgd2l0aCBHZW5vdHlwZSBhcyBhIFJhbmRvbSBlZmZlY3QNCiNJbnRlcmFjdGlvbnMgYmV0d2VlbiBPcmlnaW4gYW5kIFNpdGUNClByb3QuQy5sbWVfVFAyPC1sbWVyKFRQX3VnLmNtMl9Dfk9yaWdpbipTaXRlKygxfEdlbm90eXBlKSwgZGF0YT1Db3JhbC5UUDIpDQoNCiMjQ2hlY2sgcmVzaWR1YWxzDQpQcm90LkMubG1lX3Jlc19UUDIgPC0gc2ltdWxhdGVSZXNpZHVhbHMoZml0dGVkTW9kZWwgPSBQcm90LkMubG1lX1RQMiwgcGxvdCA9IEYpDQpwbG90KFByb3QuQy5sbWVfcmVzX1RQMikNCg0KIyNNb2RlbCByZXN1bHRzDQpzdW1tYXJ5KFByb3QuQy5sbWVfVFAyKQ0KDQpldGFfc3F1YXJlZChQcm90LkMubG1lX1RQMikNCg0KYGBgDQoNCg0KIyMjIyBQcm90ZWluIFN5bWJpb250IA0KYGBge3J9DQojI0NoZWNrIG5vcm1hbGl0eQ0KaGlzdChDb3JhbC5UUDIkVFBfdWcuY20yX1MpDQpzaGFwaXJvLnRlc3QoQ29yYWwuVFAyJFRQX3VnLmNtMl9TKQ0KI05vcm1hbA0KDQojI01vZGVsDQojRnVuY3Rpb24gb2YgU2l0ZSBhbmQgT3JpZ2luLCB3aXRoIEdlbm90eXBlIGFzIGEgUmFuZG9tIGVmZmVjdA0KI0ludGVyYWN0aW9ucyBiZXR3ZWVuIE9yaWdpbiBhbmQgU2l0ZQ0KUHJvdC5TLmxtZV9UUDI8LWxtZXIoVFBfdWcuY20yX1N+T3JpZ2luKlNpdGUrKDF8R2Vub3R5cGUpLCBkYXRhPUNvcmFsLlRQMikNCg0KIyNDaGVjayByZXNpZHVhbHMNClByb3QuUy5sbWVfcmVzX1RQMiA8LSBzaW11bGF0ZVJlc2lkdWFscyhmaXR0ZWRNb2RlbCA9IFByb3QuUy5sbWVfVFAyLCBwbG90ID0gRikNCnBsb3QoUHJvdC5TLmxtZV9yZXNfVFAyKQ0KDQojI01vZGVsIHJlc3VsdHMNCnN1bW1hcnkoUHJvdC5TLmxtZV9UUDIpDQoNCmV0YV9zcXVhcmVkKFByb3QuUy5sbWVfVFAyKQ0KDQoNCmBgYA0KDQpFZmZlY3Qgc2l6ZSBvZiBPcmlnaW4gZm9yIGVhY2ggU2l0ZQ0KYGBge3J9DQojI0tMDQpQcm90LlMubG1lX1RQMl9LTDwtbG1lcihUUF91Zy5jbTJfU35PcmlnaW4rKDF8R2Vub3R5cGUpLCBkYXRhPUNvcmFsLlRQMlt3aGljaChDb3JhbC5UUDIkU2l0ZT09IktMIiksXSkNCnN1bW1hcnkoUHJvdC5TLmxtZV9UUDJfS0wpDQpldGFfc3F1YXJlZChQcm90LlMubG1lX1RQMl9LTCkNCg0KIyNTUw0KUHJvdC5TLmxtZV9UUDJfU1M8LWxtZXIoVFBfdWcuY20yX1N+T3JpZ2luKygxfEdlbm90eXBlKSwgZGF0YT1Db3JhbC5UUDJbd2hpY2goQ29yYWwuVFAyJFNpdGU9PSJTUyIpLF0pDQpzdW1tYXJ5KFByb3QuUy5sbWVfVFAyX1NTKQ0KZXRhX3NxdWFyZWQoUHJvdC5TLmxtZV9UUDJfU1MpDQoNCmBgYA0KDQoNCg0KYGBge3IgUGxvdCBQcm90ZWluIFN5bWJpb250IFRQMn0NCiMjU3VtbWFyeSBzdGF0aXN0aWNzIGJ5IFNpdGUgYW5kIE9yaWdpbg0KVFAyX1Byb3RTeW0uc3VtPC1zdW1tYXJ5U0UoQ29yYWwuVFAyLCBtZWFzdXJldmFyPSJUUF91Zy5jbTJfUyIsIGdyb3VwdmFycz1jKCJTaXRlIiwgIk9yaWdpbiIsICJTaXRlLk9yaWciKSwgbmEucm09VFJVRSkNCg0KIyNQbG90IEF2ZXJhZ2UgU3ltYmlvbnQgUHJvdGVpbiBhY3Jvc3MgVHJlYXRtZW50cw0KVFAyX1Byb3RTeW0ucGxvdDwtZ2dwbG90KFRQMl9Qcm90U3ltLnN1bSwgYWVzKHg9U2l0ZSwgeT1UUF91Zy5jbTJfUywgY29sb3VyPVNpdGUuT3JpZykpICsgDQogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPU9yaWcuY29sb3JzLm8pKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPVRQX3VnLmNtMl9TLXNlLCB5bWF4PVRQX3VnLmNtMl9TK3NlKSwgd2lkdGg9Y2FwLnN6LCBsaW5ld2lkdGg9YmFyLnN6LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpKSArDQogIGdlb21fcG9pbnQoc2l6ZT1wb2ludC5zeiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC41KSkrDQogIHRoZW1lX2NsYXNzaWMoKSsNCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgDQogICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIA0KICAgICAgICBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT1sZWcudHh0LnN6KSwgbGVnZW5kLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPWxlZy50aXRsZS5zeiksIA0KICAgICAgICBsZWdlbmQuYm94LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3IgPSAiYmxhY2siKSkrDQogIGxhYnMoeD0iU2l0ZSBhbmQgT3JpZ2luIiwgeT1leHByZXNzaW9uKHBhc3RlKCdTeW1iaW9udCBQcm90ZWluIChcdTAzQkNnIGNtJ14tMioiKSIpKSwgY29sb3VyPSJPcmlnaW4iKSsNCiAgeWxpbSgyNTAsIDQ1MCk7IFRQMl9Qcm90U3ltLnBsb3QNCmBgYA0KDQoNCiMjIyMgQmlvbWFzcyBIb3N0IA0KYGBge3J9DQojI0NoZWNrIG5vcm1hbGl0eQ0KaGlzdChDb3JhbC5UUDIkQUZEV19tZy5jbTJfQykNCnNoYXBpcm8udGVzdChDb3JhbC5UUDIkQUZEV19tZy5jbTJfQykNCiNOb3JtYWwNCg0KIyNNb2RlbA0KI0Z1bmN0aW9uIG9mIFNpdGUgYW5kIE9yaWdpbiwgd2l0aCBHZW5vdHlwZSBhcyBhIFJhbmRvbSBlZmZlY3QNCiNJbnRlcmFjdGlvbnMgYmV0d2VlbiBPcmlnaW4gYW5kIFNpdGUNCkJpby5DLmxtZV9UUDI8LWxtZXIoQUZEV19tZy5jbTJfQ35PcmlnaW4qU2l0ZSsoMXxHZW5vdHlwZSksIGRhdGE9Q29yYWwuVFAyKQ0KDQojI0NoZWNrIHJlc2lkdWFscw0KQmlvLkMubG1lX3Jlc19UUDIgPC0gc2ltdWxhdGVSZXNpZHVhbHMoZml0dGVkTW9kZWwgPSBCaW8uQy5sbWVfVFAyLCBwbG90ID0gRikNCnBsb3QoQmlvLkMubG1lX3Jlc19UUDIpDQoNCiMjTW9kZWwgcmVzdWx0cw0Kc3VtbWFyeShCaW8uQy5sbWVfVFAyKQ0KDQpldGFfc3F1YXJlZChCaW8uQy5sbWVfVFAyKQ0KDQpgYGANCg0KDQpFZmZlY3Qgc2l6ZSBvZiBPcmlnaW4gZm9yIGVhY2ggU2l0ZQ0KYGBge3J9DQojI0tMDQpCaW8uQy5sbWVfVFAyX0tMPC1sbWVyKEFGRFdfbWcuY20yX0N+T3JpZ2luKygxfEdlbm90eXBlKSwgZGF0YT1Db3JhbC5UUDJbd2hpY2goQ29yYWwuVFAyJFNpdGU9PSJLTCIpLF0pDQpzdW1tYXJ5KEJpby5DLmxtZV9UUDJfS0wpDQpldGFfc3F1YXJlZChCaW8uQy5sbWVfVFAyX0tMKQ0KDQojI1NTDQpCaW8uQy5sbWVfVFAyX1NTPC1sbWVyKEFGRFdfbWcuY20yX0N+T3JpZ2luKygxfEdlbm90eXBlKSwgZGF0YT1Db3JhbC5UUDJbd2hpY2goQ29yYWwuVFAyJFNpdGU9PSJTUyIpLF0pDQpzdW1tYXJ5KEJpby5DLmxtZV9UUDJfU1MpDQpldGFfc3F1YXJlZChCaW8uQy5sbWVfVFAyX1NTKQ0KDQpgYGANCg0KDQpgYGB7ciBQbG90IEJpb21hc3MgSG9zdCBUUDJ9DQojI1N1bW1hcnkgc3RhdGlzdGljcyBieSBTaXRlIGFuZCBPcmlnaW4NClRQMl9CaW9Ib3N0LnN1bTwtc3VtbWFyeVNFKENvcmFsLlRQMiwgbWVhc3VyZXZhcj0iQUZEV19tZy5jbTJfQyIsIGdyb3VwdmFycz1jKCJTaXRlIiwgIk9yaWdpbiIsICJTaXRlLk9yaWciKSwgbmEucm09VFJVRSkNCg0KIyNQbG90IEF2ZXJhZ2UgSG9zdCBCaW9tYXNzIGFjcm9zcyBUcmVhdG1lbnRzDQpUUDJfQmlvSG9zdC5wbG90PC1nZ3Bsb3QoVFAyX0Jpb0hvc3Quc3VtLCBhZXMoeD1TaXRlLCB5PUFGRFdfbWcuY20yX0MsIGNvbG91cj1TaXRlLk9yaWcpKSArIA0KICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1PcmlnLmNvbG9ycy5vKSsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1BRkRXX21nLmNtMl9DLXNlLCB5bWF4PUFGRFdfbWcuY20yX0Mrc2UpLCB3aWR0aD1jYXAuc3osIGxpbmV3aWR0aD1iYXIuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpICsNCiAgZ2VvbV9wb2ludChzaXplPXBvaW50LnN6LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCANCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgDQogICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPWxlZy50eHQuc3opLCBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9bGVnLnRpdGxlLnN6KSwgDQogICAgICAgIGxlZ2VuZC5ib3guYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9ICJibGFjayIpKSsNCiAgbGFicyh4PSJTaXRlIGFuZCBPcmlnaW4iLCB5PWV4cHJlc3Npb24ocGFzdGUoJ0hvc3QgQmlvbWFzcyAobWcgY20nXi0yKiIpIikpLCBjb2xvdXI9Ik9yaWdpbiIpKw0KICB5bGltKDAsIDIpKw0KICBhbm5vdGF0ZSgidGV4dCIsIHg9MiwgeT0xLjM1LCBsYWJlbD0iLSIsIHNpemU9bGV2ZWxzLnN6LCBmb250ZmFjZT0iYm9sZCIpOyBUUDJfQmlvSG9zdC5wbG90DQpgYGANCg0KDQojIyMjIEJpb21hc3MgU3ltYmlvbnRzIA0KYGBge3J9DQojI0NoZWNrIG5vcm1hbGl0eQ0KaGlzdChDb3JhbC5UUDIkQUZEV19tZy5jbTJfUykNCnNoYXBpcm8udGVzdChDb3JhbC5UUDIkQUZEV19tZy5jbTJfUykNCiNOb3JtYWwNCg0KIyNNb2RlbCANCiNGdW5jdGlvbiBvZiBTaXRlIGFuZCBPcmlnaW4sIHdpdGggR2Vub3R5cGUgYXMgYSBSYW5kb20gZWZmZWN0DQojSW50ZXJhY3Rpb25zIGJldHdlZW4gT3JpZ2luIGFuZCBTaXRlDQpCaW8uUy5sbWVfVFAyPC1sbWVyKEFGRFdfbWcuY20yX1N+T3JpZ2luKlNpdGUrKDF8R2Vub3R5cGUpLCBkYXRhPUNvcmFsLlRQMikNCg0KIyNDaGVjayByZXNpZHVhbHMNCkJpby5TLmxtZV9yZXNfVFAyIDwtIHNpbXVsYXRlUmVzaWR1YWxzKGZpdHRlZE1vZGVsID0gQmlvLlMubG1lX1RQMiwgcGxvdCA9IEYpDQpwbG90KEJpby5TLmxtZV9yZXNfVFAyKQ0KDQojI01vZGVsIHJlc3VsdHMNCnN1bW1hcnkoQmlvLlMubG1lX1RQMikNCg0KZXRhX3NxdWFyZWQoQmlvLlMubG1lX1RQMikNCg0KYGBgDQoNCg0KRWZmZWN0IHNpemUgb2YgT3JpZ2luIGZvciBlYWNoIFNpdGUNCmBgYHtyfQ0KIyNLTA0KQmlvLlMubG1lX1RQMl9LTDwtbG1lcihBRkRXX21nLmNtMl9Tfk9yaWdpbisoMXxHZW5vdHlwZSksIGRhdGE9Q29yYWwuVFAyW3doaWNoKENvcmFsLlRQMiRTaXRlPT0iS0wiKSxdKQ0Kc3VtbWFyeShCaW8uUy5sbWVfVFAyX0tMKQ0KZXRhX3NxdWFyZWQoQmlvLlMubG1lX1RQMl9LTCkNCg0KIyNTUw0KQmlvLlMubG1lX1RQMl9TUzwtbG1lcihBRkRXX21nLmNtMl9Tfk9yaWdpbisoMXxHZW5vdHlwZSksIGRhdGE9Q29yYWwuVFAyW3doaWNoKENvcmFsLlRQMiRTaXRlPT0iU1MiKSxdKQ0Kc3VtbWFyeShCaW8uUy5sbWVfVFAyX1NTKQ0KZXRhX3NxdWFyZWQoQmlvLlMubG1lX1RQMl9TUykNCg0KYGBgDQoNCg0KYGBge3IgUGxvdCBCaW9tYXNzIFN5bWJpb250IFRQMn0NCiMjU3VtbWFyeSBzdGF0aXN0aWNzIGJ5IFNpdGUgYW5kIE9yaWdpbg0KVFAyX0Jpb1N5bS5zdW08LXN1bW1hcnlTRShDb3JhbC5UUDIsIG1lYXN1cmV2YXI9IkFGRFdfbWcuY20yX1MiLCBncm91cHZhcnM9YygiU2l0ZSIsICJPcmlnaW4iLCAiU2l0ZS5PcmlnIiksIG5hLnJtPVRSVUUpDQoNCiMjUGxvdCBBdmVyYWdlIFN5bWJpb250IEJpb21hc3MgYWNyb3NzIFRyZWF0bWVudHMNClRQMl9CaW9TeW0ucGxvdDwtZ2dwbG90KFRQMl9CaW9TeW0uc3VtLCBhZXMoeD1TaXRlLCB5PUFGRFdfbWcuY20yX1MsIGNvbG91cj1TaXRlLk9yaWcpKSArIA0KICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1PcmlnLmNvbG9ycy5vKSsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1BRkRXX21nLmNtMl9TLXNlLCB5bWF4PUFGRFdfbWcuY20yX1Mrc2UpLCB3aWR0aD1jYXAuc3osIGxpbmV3aWR0aD1iYXIuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpICsNCiAgZ2VvbV9wb2ludChzaXplPXBvaW50LnN6LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCANCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgDQogICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPWxlZy50eHQuc3opLCBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9bGVnLnRpdGxlLnN6KSwgDQogICAgICAgIGxlZ2VuZC5ib3guYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9ICJibGFjayIpKSsNCiAgbGFicyh4PSJTaXRlIGFuZCBPcmlnaW4iLCB5PWV4cHJlc3Npb24ocGFzdGUoJ1N5bWJpb250IEJpb21hc3MgKG1nIGNtJ14tMioiKSIpKSwgY29sb3VyPSJPcmlnaW4iKSsNCiAgeWxpbSgwLCAxKSsNCiAgYW5ub3RhdGUoInRleHQiLCB4PTEsIHk9MC44NSwgbGFiZWw9IioiLCBzaXplPXNpZy5zeiwgZm9udGZhY2U9ImJvbGQiKTsgVFAyX0Jpb1N5bS5wbG90DQpgYGANCg0KDQojIyMjIENobG9yb3BoeWxsDQpgYGB7cn0NCiMjQ2hlY2sgbm9ybWFsaXR5DQpoaXN0KENvcmFsLlRQMiRDaGxfdWcuY20yKQ0Kc2hhcGlyby50ZXN0KENvcmFsLlRQMiRDaGxfdWcuY20yKQ0KI05vcm1hbA0KDQojI01vZGVsDQojRnVuY3Rpb24gb2YgU2l0ZSBhbmQgT3JpZ2luLCB3aXRoIEdlbm90eXBlIGFzIGEgUmFuZG9tIGVmZmVjdA0KI0ludGVyYWN0aW9ucyBiZXR3ZWVuIE9yaWdpbiBhbmQgU2l0ZQ0KQ2hsLmxtZV9UUDI8LWxtZXIoQ2hsX3VnLmNtMn5PcmlnaW4qU2l0ZSsoMXxHZW5vdHlwZSksIGRhdGE9Q29yYWwuVFAyKQ0KDQojI0NoZWNrIHJlc2lkdWFscw0KQ2hsLmxtZV9yZXNfVFAyIDwtIHNpbXVsYXRlUmVzaWR1YWxzKGZpdHRlZE1vZGVsID0gQ2hsLmxtZV9UUDIsIHBsb3QgPSBGKQ0KcGxvdChDaGwubG1lX3Jlc19UUDIpDQoNCiMjTW9kZWwgcmVzdWx0cw0Kc3VtbWFyeShDaGwubG1lX1RQMikNCg0KZXRhX3NxdWFyZWQoQ2hsLmxtZV9UUDIpDQoNCmBgYA0KDQoNCkVmZmVjdCBzaXplIG9mIE9yaWdpbiBmb3IgZWFjaCBTaXRlDQpgYGB7cn0NCiMjS0wNCkNobC5sbWVfVFAyX0tMPC1sbWVyKENobF91Zy5jbTJ+T3JpZ2luKygxfEdlbm90eXBlKSwgZGF0YT1Db3JhbC5UUDJbd2hpY2goQ29yYWwuVFAyJFNpdGU9PSJLTCIpLF0pDQpzdW1tYXJ5KENobC5sbWVfVFAyX0tMKQ0KZXRhX3NxdWFyZWQoQ2hsLmxtZV9UUDJfS0wpDQoNCg0KIyNTUw0KQ2hsLmxtZV9UUDJfU1M8LWxtZXIoQ2hsX3VnLmNtMn5PcmlnaW4rKDF8R2Vub3R5cGUpLCBkYXRhPUNvcmFsLlRQMlt3aGljaChDb3JhbC5UUDIkU2l0ZT09IlNTIiksXSkNCnN1bW1hcnkoQ2hsLmxtZV9UUDJfU1MpDQpldGFfc3F1YXJlZChDaGwubG1lX1RQMl9TUykNCg0KYGBgDQoNCg0KYGBge3IgUGxvdCBDaGxvcm9waHlsbCBUUDJ9DQojI1N1bW1hcnkgc3RhdGlzdGljcyBieSBTaXRlIGFuZCBPcmlnaW4NClRQMl9DaGwuc3VtPC1zdW1tYXJ5U0UoQ29yYWwuVFAyLCBtZWFzdXJldmFyPSJDaGxfdWcuY20yIiwgZ3JvdXB2YXJzPWMoIlNpdGUiLCAiT3JpZ2luIiwgIlNpdGUuT3JpZyIpLCBuYS5ybT1UUlVFKQ0KDQojI1Bsb3QgQXZlcmFnZSBDaGxvcm9waHlsbCBhY3Jvc3MgVHJlYXRtZW50cw0KVFAyX0NobC5wbG90PC1nZ3Bsb3QoVFAyX0NobC5zdW0sIGFlcyh4PVNpdGUsIHk9Q2hsX3VnLmNtMiwgY29sb3VyPVNpdGUuT3JpZykpICsgDQogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPU9yaWcuY29sb3JzLm8pKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUNobF91Zy5jbTItc2UsIHltYXg9Q2hsX3VnLmNtMitzZSksIHdpZHRoPWNhcC5zeiwgbGluZXdpZHRoPWJhci5zeiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC41KSkgKw0KICBnZW9tX3BvaW50KHNpemU9cG9pbnQuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCANCiAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9bGVnLnR4dC5zeiksIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT1sZWcudGl0bGUuc3opLCANCiAgICAgICAgbGVnZW5kLmJveC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yID0gImJsYWNrIikpKw0KICBsYWJzKHg9IlNpdGUgYW5kIE9yaWdpbiIsIHk9ZXhwcmVzc2lvbihwYXN0ZSgnVG90YWwgQ2hsb3JvcGh5bGwgKFx1MDNCQ2cgY20nXi0yKiIpIikpLCBjb2xvdXI9Ik9yaWdpbiIpKw0KICB5bGltKDAsIDIuNSkrDQogIGFubm90YXRlKCJ0ZXh0IiwgeD1jKDEsMiksIHk9YygxLjUsIDIuNSksIGxhYmVsPSIqIiwgc2l6ZT1zaWcuc3osIGZvbnRmYWNlPSJib2xkIik7IFRQMl9DaGwucGxvdA0KYGBgDQoNCg0KIyMjIFRQMw0KDQpgYGB7cn0NCiMjU3Vic2V0IFRpbWVwb2ludCAzIA0KQ29yYWwuVFAzPC1zdWJzZXQoQ29yYWwucm0sIFRpbWVQPT0iVFAzIikNCg0KYGBgDQoNCg0KIyMjIyBQcm90ZWluIEhvc3QgDQpgYGB7cn0NCiMjQ2hlY2sgbm9ybWFsaXR5DQpoaXN0KENvcmFsLlRQMyRUUF91Zy5jbTJfQykNCnNoYXBpcm8udGVzdChDb3JhbC5UUDMkVFBfdWcuY20yX0MpDQojTm9ybWFsDQoNCiMjTW9kZWwgDQojRnVuY3Rpb24gb2YgU2l0ZSBhbmQgT3JpZ2luLCB3aXRoIEdlbm90eXBlIGFzIGEgUmFuZG9tIGVmZmVjdA0KI0ludGVyYWN0aW9ucyBiZXR3ZWVuIE9yaWdpbiBhbmQgU2l0ZQ0KUHJvdC5DLmxtZV9UUDM8LWxtZXIoVFBfdWcuY20yX0N+T3JpZ2luKlNpdGUrKDF8R2Vub3R5cGUpLCBkYXRhPUNvcmFsLlRQMykNCg0KIyNDaGVjayByZXNpZHVhbHMNClByb3QuQy5sbWVfcmVzX1RQMyA8LSBzaW11bGF0ZVJlc2lkdWFscyhmaXR0ZWRNb2RlbCA9IFByb3QuQy5sbWVfVFAzLCBwbG90ID0gRikNCnBsb3QoUHJvdC5DLmxtZV9yZXNfVFAzKQ0KDQojI01vZGVsIHJlc3VsdHMNCnN1bW1hcnkoUHJvdC5DLmxtZV9UUDMpDQoNCmV0YV9zcXVhcmVkKFByb3QuQy5sbWVfVFAzKQ0KDQpgYGANCg0KDQojIyMjIFByb3RlaW4gU3ltYmlvbnQgDQpgYGB7cn0NCiMjQ2hlY2sgbm9ybWFsaXR5DQpoaXN0KENvcmFsLlRQMyRUUF91Zy5jbTJfUykNCnNoYXBpcm8udGVzdChDb3JhbC5UUDMkVFBfdWcuY20yX1MpDQojTm9ybWFsDQoNCiMjTW9kZWwNCiNGdW5jdGlvbiBvZiBTaXRlIGFuZCBPcmlnaW4sIHdpdGggR2Vub3R5cGUgYXMgYSBSYW5kb20gZWZmZWN0DQojSW50ZXJhY3Rpb25zIGJldHdlZW4gT3JpZ2luIGFuZCBTaXRlDQpQcm90LlMubG1lX1RQMzwtbG1lcihUUF91Zy5jbTJfU35PcmlnaW4qU2l0ZSsoMXxHZW5vdHlwZSksIGRhdGE9Q29yYWwuVFAzKQ0KDQojI0NoZWNrIHJlc2lkdWFscw0KUHJvdC5TLmxtZV9yZXNfVFAzIDwtIHNpbXVsYXRlUmVzaWR1YWxzKGZpdHRlZE1vZGVsID0gUHJvdC5TLmxtZV9UUDMsIHBsb3QgPSBGKQ0KcGxvdChQcm90LlMubG1lX3Jlc19UUDMpDQoNCiMjTW9kZWwgcmVzdWx0cw0Kc3VtbWFyeShQcm90LlMubG1lX1RQMykNCg0KZXRhX3NxdWFyZWQoUHJvdC5TLmxtZV9UUDMpDQoNCmBgYA0KDQpFZmZlY3Qgc2l6ZSBvZiBPcmlnaW4gZm9yIGVhY2ggU2l0ZQ0KYGBge3J9DQojI0tMDQpQcm90LlMubG1lX1RQM19LTDwtbG1lcihUUF91Zy5jbTJfU35PcmlnaW4rKDF8R2Vub3R5cGUpLCBkYXRhPUNvcmFsLlRQM1t3aGljaChDb3JhbC5UUDMkU2l0ZT09IktMIiksXSkNCnN1bW1hcnkoUHJvdC5TLmxtZV9UUDNfS0wpDQpldGFfc3F1YXJlZChQcm90LlMubG1lX1RQM19LTCkNCg0KDQojI1NTDQpQcm90LlMubG1lX1RQM19TUzwtbG1lcihUUF91Zy5jbTJfU35PcmlnaW4rKDF8R2Vub3R5cGUpLCBkYXRhPUNvcmFsLlRQM1t3aGljaChDb3JhbC5UUDMkU2l0ZT09IlNTIiksXSkNCnN1bW1hcnkoUHJvdC5TLmxtZV9UUDNfU1MpDQpldGFfc3F1YXJlZChQcm90LlMubG1lX1RQM19TUykNCg0KYGBgDQoNCg0KDQpgYGB7ciBQbG90IFByb3RlaW4gU3ltYmlvbnQgVFAzfQ0KIyNTdW1tYXJ5IHN0YXRpc3RpY3MgYnkgU2l0ZSBhbmQgT3JpZ2luDQpUUDNfUHJvdFN5bS5zdW08LXN1bW1hcnlTRShDb3JhbC5UUDMsIG1lYXN1cmV2YXI9IlRQX3VnLmNtMl9TIiwgZ3JvdXB2YXJzPWMoIlNpdGUiLCAiT3JpZ2luIiwgIlNpdGUuT3JpZyIpLCBuYS5ybT1UUlVFKQ0KDQojI1Bsb3QgQXZlcmFnZSBTeW1iaW9udCBQcm90ZWluIGFjcm9zcyBUcmVhdG1lbnRzDQpUUDNfUHJvdFN5bS5wbG90PC1nZ3Bsb3QoVFAzX1Byb3RTeW0uc3VtLCBhZXMoeD1TaXRlLCB5PVRQX3VnLmNtMl9TLCBjb2xvdXI9U2l0ZS5PcmlnKSkgKyANCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9T3JpZy5jb2xvcnMubykrDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49VFBfdWcuY20yX1Mtc2UsIHltYXg9VFBfdWcuY20yX1Mrc2UpLCB3aWR0aD1jYXAuc3osIGxpbmV3aWR0aD1iYXIuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpICsNCiAgZ2VvbV9wb2ludChzaXplPXBvaW50LnN6LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCANCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgDQogICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPWxlZy50eHQuc3opLCBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9bGVnLnRpdGxlLnN6KSwgDQogICAgICAgIGxlZ2VuZC5ib3guYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9ICJibGFjayIpKSsNCiAgbGFicyh4PSJTaXRlIGFuZCBPcmlnaW4iLCB5PWV4cHJlc3Npb24ocGFzdGUoJ1N5bWJpb250IFByb3RlaW4gKFx1MDNCQ2cgY20nXi0yKiIpIikpLCBjb2xvdXI9Ik9yaWdpbiIpKw0KICB5bGltKDI1MCwgNDUwKTsgVFAzX1Byb3RTeW0ucGxvdA0KYGBgDQoNCg0KIyMjIyBCaW9tYXNzIEhvc3QgDQpgYGB7cn0NCiMjQ2hlY2sgbm9ybWFsaXR5DQpoaXN0KENvcmFsLlRQMyRBRkRXX21nLmNtMl9DKQ0Kc2hhcGlyby50ZXN0KENvcmFsLlRQMyRBRkRXX21nLmNtMl9DKQ0KI05vcm1hbA0KDQojI01vZGVsDQojRnVuY3Rpb24gb2YgU2l0ZSBhbmQgT3JpZ2luLCB3aXRoIEdlbm90eXBlIGFzIGEgUmFuZG9tIGVmZmVjdA0KI0ludGVyYWN0aW9ucyBiZXR3ZWVuIE9yaWdpbiBhbmQgU2l0ZQ0KQmlvLkMubG1lX1RQMzwtbG1lcihBRkRXX21nLmNtMl9Dfk9yaWdpbipTaXRlKygxfEdlbm90eXBlKSwgZGF0YT1Db3JhbC5UUDMpDQoNCiMjQ2hlY2sgcmVzaWR1YWxzDQpCaW8uQy5sbWVfcmVzX1RQMyA8LSBzaW11bGF0ZVJlc2lkdWFscyhmaXR0ZWRNb2RlbCA9IEJpby5DLmxtZV9UUDMsIHBsb3QgPSBGKQ0KcGxvdChCaW8uQy5sbWVfcmVzX1RQMykNCg0KIyNNb2RlbCByZXN1bHRzDQpzdW1tYXJ5KEJpby5DLmxtZV9UUDMpDQoNCmV0YV9zcXVhcmVkKEJpby5DLmxtZV9UUDMpDQoNCmBgYA0KDQoNCkVmZmVjdCBzaXplIG9mIE9yaWdpbiBmb3IgZWFjaCBTaXRlDQpgYGB7cn0NCiMjS0wNCkJpby5DLmxtZV9UUDNfS0w8LWxtZXIoQUZEV19tZy5jbTJfQ35PcmlnaW4rKDF8R2Vub3R5cGUpLCBkYXRhPUNvcmFsLlRQM1t3aGljaChDb3JhbC5UUDMkU2l0ZT09IktMIiksXSkNCnN1bW1hcnkoQmlvLkMubG1lX1RQM19LTCkNCmV0YV9zcXVhcmVkKEJpby5DLmxtZV9UUDNfS0wpDQoNCiMjU1MNCkJpby5DLmxtZV9UUDNfU1M8LWxtZXIoQUZEV19tZy5jbTJfQ35PcmlnaW4rKDF8R2Vub3R5cGUpLCBkYXRhPUNvcmFsLlRQM1t3aGljaChDb3JhbC5UUDMkU2l0ZT09IlNTIiksXSkNCnN1bW1hcnkoQmlvLkMubG1lX1RQM19TUykNCmV0YV9zcXVhcmVkKEJpby5DLmxtZV9UUDNfU1MpDQoNCmBgYA0KDQoNCmBgYHtyIFBsb3QgQmlvbWFzcyBIb3N0IFRQM30NCiMjU3VtbWFyeSBzdGF0aXN0aWNzIGJ5IFNpdGUgYW5kIE9yaWdpbg0KVFAzX0Jpb0hvc3Quc3VtPC1zdW1tYXJ5U0UoQ29yYWwuVFAzLCBtZWFzdXJldmFyPSJBRkRXX21nLmNtMl9DIiwgZ3JvdXB2YXJzPWMoIlNpdGUiLCAiT3JpZ2luIiwgIlNpdGUuT3JpZyIpLCBuYS5ybT1UUlVFKQ0KDQojI1Bsb3QgQXZlcmFnZSBIb3N0IEJpb21hc3MgYWNyb3NzIFRyZWF0bWVudHMNClRQM19CaW9Ib3N0LnBsb3Q8LWdncGxvdChUUDNfQmlvSG9zdC5zdW0sIGFlcyh4PVNpdGUsIHk9QUZEV19tZy5jbTJfQywgY29sb3VyPVNpdGUuT3JpZykpICsgDQogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPU9yaWcuY29sb3JzLm8pKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUFGRFdfbWcuY20yX0Mtc2UsIHltYXg9QUZEV19tZy5jbTJfQytzZSksIHdpZHRoPWNhcC5zeiwgbGluZXdpZHRoPWJhci5zeiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC41KSkgKw0KICBnZW9tX3BvaW50KHNpemU9cG9pbnQuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCANCiAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9bGVnLnR4dC5zeiksIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT1sZWcudGl0bGUuc3opLCANCiAgICAgICAgbGVnZW5kLmJveC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yID0gImJsYWNrIikpKw0KICBsYWJzKHg9IlNpdGUgYW5kIE9yaWdpbiIsIHk9ZXhwcmVzc2lvbihwYXN0ZSgnSG9zdCBCaW9tYXNzIChtZyBjbSdeLTIqIikiKSksIGNvbG91cj0iT3JpZ2luIikrDQogIHlsaW0oMCwgMik7IFRQM19CaW9Ib3N0LnBsb3QNCmBgYA0KDQoNCiMjIyMgQmlvbWFzcyBTeW1iaW9udHMgDQpgYGB7cn0NCiMjQ2hlY2sgbm9ybWFsaXR5DQpoaXN0KENvcmFsLlRQMyRBRkRXX21nLmNtMl9TKQ0Kc2hhcGlyby50ZXN0KENvcmFsLlRQMyRBRkRXX21nLmNtMl9TKQ0KI1NsaWdodGx5IG5vbiBOb3JtYWwNCg0KaGlzdChsb2coQ29yYWwuVFAzJEFGRFdfbWcuY20yX1MrMSkpDQpzaGFwaXJvLnRlc3QobG9nKENvcmFsLlRQMyRBRkRXX21nLmNtMl9TKzEpKQ0KI05vcm1hbA0KDQojI01vZGVsIA0KI0Z1bmN0aW9uIG9mIFNpdGUgYW5kIE9yaWdpbiwgd2l0aCBHZW5vdHlwZSBhcyBhIFJhbmRvbSBlZmZlY3QNCiNJbnRlcmFjdGlvbnMgYmV0d2VlbiBPcmlnaW4gYW5kIFNpdGUNCkJpby5TLmxtZV9UUDM8LWxtZXIobG9nKEFGRFdfbWcuY20yX1MrMSl+T3JpZ2luKlNpdGUrKDF8R2Vub3R5cGUpLCBkYXRhPUNvcmFsLlRQMykNCg0KIyNDaGVjayByZXNpZHVhbHMNCkJpby5TLmxtZV9yZXNfVFAzIDwtIHNpbXVsYXRlUmVzaWR1YWxzKGZpdHRlZE1vZGVsID0gQmlvLlMubG1lX1RQMywgcGxvdCA9IEYpDQpwbG90KEJpby5TLmxtZV9yZXNfVFAzKQ0KDQojI01vZGVsIHJlc3VsdHMNCnN1bW1hcnkoQmlvLlMubG1lX1RQMykNCg0KZXRhX3NxdWFyZWQoQmlvLlMubG1lX1RQMykNCg0KYGBgDQoNCg0KRWZmZWN0IHNpemUgb2YgT3JpZ2luIGZvciBlYWNoIFNpdGUNCmBgYHtyfQ0KIyNLTA0KQmlvLlMubG1lX1RQM19LTDwtbG1lcihsb2coQUZEV19tZy5jbTJfUysxKX5PcmlnaW4rKDF8R2Vub3R5cGUpLCBkYXRhPUNvcmFsLlRQM1t3aGljaChDb3JhbC5UUDMkU2l0ZT09IktMIiksXSkNCnN1bW1hcnkoQmlvLlMubG1lX1RQM19LTCkNCmV0YV9zcXVhcmVkKEJpby5TLmxtZV9UUDNfS0wpDQoNCiMjU1MNCkJpby5TLmxtZV9UUDNfU1M8LWxtZXIobG9nKEFGRFdfbWcuY20yX1MrMSl+T3JpZ2luKygxfEdlbm90eXBlKSwgZGF0YT1Db3JhbC5UUDNbd2hpY2goQ29yYWwuVFAzJFNpdGU9PSJTUyIpLF0pDQpzdW1tYXJ5KEJpby5TLmxtZV9UUDNfU1MpDQpldGFfc3F1YXJlZChCaW8uUy5sbWVfVFAzX1NTKQ0KYGBgDQoNCg0KYGBge3IgUGxvdCBCaW9tYXNzIFN5bWJpb250IFRQM30NCiMjU3VtbWFyeSBzdGF0aXN0aWNzIGJ5IFNpdGUgYW5kIE9yaWdpbg0KVFAzX0Jpb1N5bS5zdW08LXN1bW1hcnlTRShDb3JhbC5UUDMsIG1lYXN1cmV2YXI9IkFGRFdfbWcuY20yX1MiLCBncm91cHZhcnM9YygiU2l0ZSIsICJPcmlnaW4iLCAiU2l0ZS5PcmlnIiksIG5hLnJtPVRSVUUpDQoNCiMjUGxvdCBBdmVyYWdlIFN5bWJpb250IEJpb21hc3MgYWNyb3NzIFRyZWF0bWVudHMNClRQM19CaW9TeW0ucGxvdDwtZ2dwbG90KFRQM19CaW9TeW0uc3VtLCBhZXMoeD1TaXRlLCB5PUFGRFdfbWcuY20yX1MsIGNvbG91cj1TaXRlLk9yaWcpKSArIA0KICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1PcmlnLmNvbG9ycy5vKSsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1BRkRXX21nLmNtMl9TLXNlLCB5bWF4PUFGRFdfbWcuY20yX1Mrc2UpLCB3aWR0aD1jYXAuc3osIGxpbmV3aWR0aD1iYXIuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpICsNCiAgZ2VvbV9wb2ludChzaXplPXBvaW50LnN6LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCANCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgDQogICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPWxlZy50eHQuc3opLCBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9bGVnLnRpdGxlLnN6KSwgDQogICAgICAgIGxlZ2VuZC5ib3guYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9ICJibGFjayIpKSsNCiAgbGFicyh4PSJTaXRlIGFuZCBPcmlnaW4iLCB5PWV4cHJlc3Npb24ocGFzdGUoJ1N5bWJpb250IEJpb21hc3MgKG1nIGNtJ14tMioiKSIpKSwgY29sb3VyPSJPcmlnaW4iKSsNCiAgeWxpbSgwLCAxKTsgVFAzX0Jpb1N5bS5wbG90DQpgYGANCg0KDQojIyMjIENobG9yb3BoeWxsDQpgYGB7cn0NCiMjQ2hlY2sgbm9ybWFsaXR5DQpoaXN0KENvcmFsLlRQMyRDaGxfdWcuY20yKQ0Kc2hhcGlyby50ZXN0KENvcmFsLlRQMyRDaGxfdWcuY20yKQ0KI05vdCBub3JtYWwNCg0KaGlzdChsb2coQ29yYWwuVFAzJENobF91Zy5jbTIrMSkpDQpzaGFwaXJvLnRlc3QobG9nKENvcmFsLlRQMyRDaGxfdWcuY20yKzEpKQ0KI05vcm1hbA0KDQojI01vZGVsDQojRnVuY3Rpb24gb2YgU2l0ZSBhbmQgT3JpZ2luLCB3aXRoIEdlbm90eXBlIGFzIGEgUmFuZG9tIGVmZmVjdA0KI0ludGVyYWN0aW9ucyBiZXR3ZWVuIE9yaWdpbiBhbmQgU2l0ZQ0KQ2hsLmxtZV9UUDM8LWxtZXIobG9nKENobF91Zy5jbTIrMSl+T3JpZ2luKlNpdGUrKDF8R2Vub3R5cGUpLCBkYXRhPUNvcmFsLlRQMykNCg0KIyNDaGVjayByZXNpZHVhbHMNCkNobC5sbWVfcmVzX1RQMyA8LSBzaW11bGF0ZVJlc2lkdWFscyhmaXR0ZWRNb2RlbCA9IENobC5sbWVfVFAzLCBwbG90ID0gRikNCnBsb3QoQ2hsLmxtZV9yZXNfVFAzKQ0KDQojI01vZGVsIHJlc3VsdHMNCnN1bW1hcnkoQ2hsLmxtZV9UUDMpDQoNCmV0YV9zcXVhcmVkKENobC5sbWVfVFAzKQ0KDQpgYGANCg0KDQpFZmZlY3Qgc2l6ZSBvZiBPcmlnaW4gZm9yIGVhY2ggU2l0ZQ0KYGBge3J9DQojI0tMDQpDaGwubG1lX1RQM19LTDwtbG1lcihsb2coQ2hsX3VnLmNtMisxKX5PcmlnaW4rKDF8R2Vub3R5cGUpLCBkYXRhPUNvcmFsLlRQM1t3aGljaChDb3JhbC5UUDMkU2l0ZT09IktMIiksXSkNCnN1bW1hcnkoQ2hsLmxtZV9UUDNfS0wpDQpldGFfc3F1YXJlZChDaGwubG1lX1RQM19LTCkNCg0KDQojI1NTDQpDaGwubG1lX1RQM19TUzwtbG1lcihsb2coQ2hsX3VnLmNtMisxKX5PcmlnaW4rKDF8R2Vub3R5cGUpLCBkYXRhPUNvcmFsLlRQM1t3aGljaChDb3JhbC5UUDMkU2l0ZT09IlNTIiksXSkNCnN1bW1hcnkoQ2hsLmxtZV9UUDNfU1MpDQpldGFfc3F1YXJlZChDaGwubG1lX1RQM19TUykNCg0KYGBgDQoNCg0KYGBge3IgUGxvdCBDaGxvcm9waHlsbCBUUDN9DQojI1N1bW1hcnkgc3RhdGlzdGljcyBieSBTaXRlIGFuZCBPcmlnaW4NClRQM19DaGwuc3VtPC1zdW1tYXJ5U0UoQ29yYWwuVFAzLCBtZWFzdXJldmFyPSJDaGxfdWcuY20yIiwgZ3JvdXB2YXJzPWMoIlNpdGUiLCAiT3JpZ2luIiwgIlNpdGUuT3JpZyIpLCBuYS5ybT1UUlVFKQ0KDQojI1Bsb3QgQXZlcmFnZSBDaGxvcm9waHlsbCBhY3Jvc3MgVHJlYXRtZW50cw0KVFAzX0NobC5wbG90PC1nZ3Bsb3QoVFAzX0NobC5zdW0sIGFlcyh4PVNpdGUsIHk9Q2hsX3VnLmNtMiwgY29sb3VyPVNpdGUuT3JpZykpICsgDQogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPU9yaWcuY29sb3JzLm8pKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUNobF91Zy5jbTItc2UsIHltYXg9Q2hsX3VnLmNtMitzZSksIHdpZHRoPWNhcC5zeiwgbGluZXdpZHRoPWJhci5zeiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC41KSkgKw0KICBnZW9tX3BvaW50KHNpemU9cG9pbnQuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCANCiAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9bGVnLnR4dC5zeiksIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT1sZWcudGl0bGUuc3opLCANCiAgICAgICAgbGVnZW5kLmJveC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yID0gImJsYWNrIikpKw0KICBsYWJzKHg9IlNpdGUgYW5kIE9yaWdpbiIsIHk9ZXhwcmVzc2lvbihwYXN0ZSgnVG90YWwgQ2hsb3JvcGh5bGwgKFx1MDNCQ2cgY20nXi0yKiIpIikpLCBjb2xvdXI9Ik9yaWdpbiIpKw0KICB5bGltKDAsIDIuNSkrDQogIGFubm90YXRlKCJ0ZXh0IiwgeD0xLCB5PTEuNywgbGFiZWw9Ii0iLCBzaXplPWxldmVscy5zeiwgZm9udGZhY2U9ImJvbGQiKTsgVFAzX0NobC5wbG90DQpgYGANCg0KDQoNCiMjIyBUUDQNCg0KYGBge3J9DQojI1N1YnNldCBUaW1lcG9pbnQgNCANCkNvcmFsLlRQNDwtc3Vic2V0KENvcmFsLnJtLCBUaW1lUD09IlRQNCIpDQoNCmBgYA0KDQoNCiMjIyMgUHJvdGVpbiBIb3N0IA0KYGBge3J9DQojI0NoZWNrIG5vcm1hbGl0eQ0KaGlzdChDb3JhbC5UUDQkVFBfdWcuY20yX0MpDQpzaGFwaXJvLnRlc3QoQ29yYWwuVFA0JFRQX3VnLmNtMl9DKQ0KI05vcm1hbA0KDQojI01vZGVsIA0KI0Z1bmN0aW9uIG9mIFNpdGUgYW5kIE9yaWdpbiwgd2l0aCBHZW5vdHlwZSBhcyBhIFJhbmRvbSBlZmZlY3QNCiNJbnRlcmFjdGlvbnMgYmV0d2VlbiBPcmlnaW4gYW5kIFNpdGUNClByb3QuQy5sbWVfVFA0PC1sbWVyKFRQX3VnLmNtMl9Dfk9yaWdpbipTaXRlKygxfEdlbm90eXBlKSwgZGF0YT1Db3JhbC5UUDQpDQoNCiMjQ2hlY2sgcmVzaWR1YWxzDQpQcm90LkMubG1lX3Jlc19UUDQgPC0gc2ltdWxhdGVSZXNpZHVhbHMoZml0dGVkTW9kZWwgPSBQcm90LkMubG1lX1RQNCwgcGxvdCA9IEYpDQpwbG90KFByb3QuQy5sbWVfcmVzX1RQNCkNCg0KIyNNb2RlbCByZXN1bHRzDQpzdW1tYXJ5KFByb3QuQy5sbWVfVFA0KQ0KDQpldGFfc3F1YXJlZChQcm90LkMubG1lX1RQNCkNCg0KYGBgDQoNCg0KIyMjIyBQcm90ZWluIFN5bWJpb250IA0KYGBge3J9DQojI0NoZWNrIG5vcm1hbGl0eQ0KaGlzdChDb3JhbC5UUDQkVFBfdWcuY20yX1MpDQpzaGFwaXJvLnRlc3QoQ29yYWwuVFA0JFRQX3VnLmNtMl9TKQ0KI05vcm1hbA0KDQojI01vZGVsDQojRnVuY3Rpb24gb2YgU2l0ZSBhbmQgT3JpZ2luLCB3aXRoIEdlbm90eXBlIGFzIGEgUmFuZG9tIGVmZmVjdA0KI0ludGVyYWN0aW9ucyBiZXR3ZWVuIE9yaWdpbiBhbmQgU2l0ZQ0KUHJvdC5TLmxtZV9UUDQ8LWxtZXIoVFBfdWcuY20yX1N+T3JpZ2luKlNpdGUrKDF8R2Vub3R5cGUpLCBkYXRhPUNvcmFsLlRQNCkNCg0KIyNDaGVjayByZXNpZHVhbHMNClByb3QuUy5sbWVfcmVzX1RQNCA8LSBzaW11bGF0ZVJlc2lkdWFscyhmaXR0ZWRNb2RlbCA9IFByb3QuUy5sbWVfVFA0LCBwbG90ID0gRikNCnBsb3QoUHJvdC5TLmxtZV9yZXNfVFA0KQ0KDQojI01vZGVsIHJlc3VsdHMNCnN1bW1hcnkoUHJvdC5TLmxtZV9UUDQpDQoNCmV0YV9zcXVhcmVkKFByb3QuUy5sbWVfVFA0KQ0KDQpgYGANCg0KRWZmZWN0IHNpemUgb2YgT3JpZ2luIGZvciBlYWNoIFNpdGUNCmBgYHtyfQ0KIyNLTA0KUHJvdC5TLmxtZV9UUDRfS0w8LWxtZXIoVFBfdWcuY20yX1N+T3JpZ2luKygxfEdlbm90eXBlKSwgZGF0YT1Db3JhbC5UUDRbd2hpY2goQ29yYWwuVFA0JFNpdGU9PSJLTCIpLF0pDQpzdW1tYXJ5KFByb3QuUy5sbWVfVFA0X0tMKQ0KZXRhX3NxdWFyZWQoUHJvdC5TLmxtZV9UUDRfS0wpDQoNCiMjU1MNClByb3QuUy5sbWVfVFA0X1NTPC1sbWVyKFRQX3VnLmNtMl9Tfk9yaWdpbisoMXxHZW5vdHlwZSksIGRhdGE9Q29yYWwuVFA0W3doaWNoKENvcmFsLlRQNCRTaXRlPT0iU1MiKSxdKQ0Kc3VtbWFyeShQcm90LlMubG1lX1RQNF9TUykNCmV0YV9zcXVhcmVkKFByb3QuUy5sbWVfVFA0X1NTKQ0KYGBgDQoNCg0KDQpgYGB7ciBQbG90IFByb3RlaW4gU3ltYmlvbnQgVFA0fQ0KIyNTdW1tYXJ5IHN0YXRpc3RpY3MgYnkgU2l0ZSBhbmQgT3JpZ2luDQpUUDRfUHJvdFN5bS5zdW08LXN1bW1hcnlTRShDb3JhbC5UUDQsIG1lYXN1cmV2YXI9IlRQX3VnLmNtMl9TIiwgZ3JvdXB2YXJzPWMoIlNpdGUiLCAiT3JpZ2luIiwgIlNpdGUuT3JpZyIpLCBuYS5ybT1UUlVFKQ0KDQojI1Bsb3QgQXZlcmFnZSBTeW1iaW9udCBQcm90ZWluIGFjcm9zcyBUcmVhdG1lbnRzDQpUUDRfUHJvdFN5bS5wbG90PC1nZ3Bsb3QoVFA0X1Byb3RTeW0uc3VtLCBhZXMoeD1TaXRlLCB5PVRQX3VnLmNtMl9TLCBjb2xvdXI9U2l0ZS5PcmlnKSkgKyANCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9T3JpZy5jb2xvcnMubykrDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49VFBfdWcuY20yX1Mtc2UsIHltYXg9VFBfdWcuY20yX1Mrc2UpLCB3aWR0aD1jYXAuc3osIGxpbmV3aWR0aD1iYXIuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpICsNCiAgZ2VvbV9wb2ludChzaXplPXBvaW50LnN6LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCANCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgDQogICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPWxlZy50eHQuc3opLCBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9bGVnLnRpdGxlLnN6KSwgDQogICAgICAgIGxlZ2VuZC5ib3guYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9ICJibGFjayIpKSsNCiAgbGFicyh4PSJTaXRlIGFuZCBPcmlnaW4iLCB5PWV4cHJlc3Npb24ocGFzdGUoJ1N5bWJpb250IFByb3RlaW4gKFx1MDNCQ2cgY20nXi0yKiIpIikpLCBjb2xvdXI9Ik9yaWdpbiIpKw0KICB5bGltKDI1MCwgNDUwKTsgVFA0X1Byb3RTeW0ucGxvdA0KYGBgDQoNCg0KIyMjIyBCaW9tYXNzIEhvc3QgDQpgYGB7cn0NCiMjQ2hlY2sgbm9ybWFsaXR5DQpoaXN0KENvcmFsLlRQNCRBRkRXX21nLmNtMl9DKQ0Kc2hhcGlyby50ZXN0KENvcmFsLlRQNCRBRkRXX21nLmNtMl9DKQ0KI05vcm1hbA0KDQojI01vZGVsDQojRnVuY3Rpb24gb2YgU2l0ZSBhbmQgT3JpZ2luLCB3aXRoIEdlbm90eXBlIGFzIGEgUmFuZG9tIGVmZmVjdA0KI0ludGVyYWN0aW9ucyBiZXR3ZWVuIE9yaWdpbiBhbmQgU2l0ZQ0KQmlvLkMubG1lX1RQNDwtbG1lcihBRkRXX21nLmNtMl9Dfk9yaWdpbipTaXRlKygxfEdlbm90eXBlKSwgZGF0YT1Db3JhbC5UUDQpDQoNCiMjQ2hlY2sgcmVzaWR1YWxzDQpCaW8uQy5sbWVfcmVzX1RQNCA8LSBzaW11bGF0ZVJlc2lkdWFscyhmaXR0ZWRNb2RlbCA9IEJpby5DLmxtZV9UUDQsIHBsb3QgPSBGKQ0KcGxvdChCaW8uQy5sbWVfcmVzX1RQNCkNCg0KIyNNb2RlbCByZXN1bHRzDQpzdW1tYXJ5KEJpby5DLmxtZV9UUDQpDQoNCmV0YV9zcXVhcmVkKEJpby5DLmxtZV9UUDQpDQoNCmBgYA0KDQoNCkVmZmVjdCBzaXplIG9mIE9yaWdpbiBmb3IgZWFjaCBTaXRlDQpgYGB7cn0NCg0KIyNLTA0KQmlvLkMubG1lX1RQNF9LTDwtbG1lcihBRkRXX21nLmNtMl9Dfk9yaWdpbisoMXxHZW5vdHlwZSksIGRhdGE9Q29yYWwuVFA0W3doaWNoKENvcmFsLlRQNCRTaXRlPT0iS0wiKSxdKQ0Kc3VtbWFyeShCaW8uQy5sbWVfVFA0X0tMKQ0KZXRhX3NxdWFyZWQoQmlvLkMubG1lX1RQNF9LTCkNCg0KIyNTUw0KQmlvLkMubG1lX1RQNF9TUzwtbG1lcihBRkRXX21nLmNtMl9Dfk9yaWdpbisoMXxHZW5vdHlwZSksIGRhdGE9Q29yYWwuVFA0W3doaWNoKENvcmFsLlRQNCRTaXRlPT0iU1MiKSxdKQ0Kc3VtbWFyeShCaW8uQy5sbWVfVFA0X1NTKQ0KZXRhX3NxdWFyZWQoQmlvLkMubG1lX1RQNF9TUykNCg0KDQpgYGANCg0KDQpgYGB7ciBQbG90IEJpb21hc3MgSG9zdCBUUDR9DQojI1N1bW1hcnkgc3RhdGlzdGljcyBieSBTaXRlIGFuZCBPcmlnaW4NClRQNF9CaW9Ib3N0LnN1bTwtc3VtbWFyeVNFKENvcmFsLlRQNCwgbWVhc3VyZXZhcj0iQUZEV19tZy5jbTJfQyIsIGdyb3VwdmFycz1jKCJTaXRlIiwgIk9yaWdpbiIsICJTaXRlLk9yaWciKSwgbmEucm09VFJVRSkNCg0KIyNQbG90IEF2ZXJhZ2UgSG9zdCBCaW9tYXNzIGFjcm9zcyBUcmVhdG1lbnRzDQpUUDRfQmlvSG9zdC5wbG90PC1nZ3Bsb3QoVFA0X0Jpb0hvc3Quc3VtLCBhZXMoeD1TaXRlLCB5PUFGRFdfbWcuY20yX0MsIGNvbG91cj1TaXRlLk9yaWcpKSArIA0KICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1PcmlnLmNvbG9ycy5vKSsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1BRkRXX21nLmNtMl9DLXNlLCB5bWF4PUFGRFdfbWcuY20yX0Mrc2UpLCB3aWR0aD1jYXAuc3osIGxpbmV3aWR0aD1iYXIuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpICsNCiAgZ2VvbV9wb2ludChzaXplPXBvaW50LnN6LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCANCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgDQogICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPWxlZy50eHQuc3opLCBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9bGVnLnRpdGxlLnN6KSwgDQogICAgICAgIGxlZ2VuZC5ib3guYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9ICJibGFjayIpKSsNCiAgbGFicyh4PSJTaXRlIGFuZCBPcmlnaW4iLCB5PWV4cHJlc3Npb24ocGFzdGUoJ0hvc3QgQmlvbWFzcyAobWcgY20nXi0yKiIpIikpLCBjb2xvdXI9Ik9yaWdpbiIpKw0KICB5bGltKDAsIDIpKw0KICBhbm5vdGF0ZSgidGV4dCIsIHg9MiwgeT0xLjYsIGxhYmVsPSIqIiwgc2l6ZT1zaWcuc3osIGZvbnRmYWNlPSJib2xkIik7IFRQNF9CaW9Ib3N0LnBsb3QNCmBgYA0KDQoNCiMjIyMgQmlvbWFzcyBTeW1iaW9udHMgDQpgYGB7cn0NCiMjQ2hlY2sgbm9ybWFsaXR5DQpoaXN0KENvcmFsLlRQNCRBRkRXX21nLmNtMl9TKQ0Kc2hhcGlyby50ZXN0KENvcmFsLlRQNCRBRkRXX21nLmNtMl9TKQ0KI05vcm1hbA0KDQojI01vZGVsIA0KI0Z1bmN0aW9uIG9mIFNpdGUgYW5kIE9yaWdpbiwgd2l0aCBHZW5vdHlwZSBhcyBhIFJhbmRvbSBlZmZlY3QNCiNJbnRlcmFjdGlvbnMgYmV0d2VlbiBPcmlnaW4gYW5kIFNpdGUNCkJpby5TLmxtZV9UUDQ8LWxtZXIoQUZEV19tZy5jbTJfU35PcmlnaW4qU2l0ZSsoMXxHZW5vdHlwZSksIGRhdGE9Q29yYWwuVFA0KQ0KDQojI0NoZWNrIHJlc2lkdWFscw0KQmlvLlMubG1lX3Jlc19UUDQgPC0gc2ltdWxhdGVSZXNpZHVhbHMoZml0dGVkTW9kZWwgPSBCaW8uUy5sbWVfVFA0LCBwbG90ID0gRikNCnBsb3QoQmlvLlMubG1lX3Jlc19UUDQpDQoNCiMjTW9kZWwgcmVzdWx0cw0Kc3VtbWFyeShCaW8uUy5sbWVfVFA0KQ0KDQpldGFfc3F1YXJlZChCaW8uUy5sbWVfVFA0KQ0KDQpgYGANCg0KDQpFZmZlY3Qgc2l6ZSBvZiBPcmlnaW4gZm9yIGVhY2ggU2l0ZQ0KYGBge3J9DQojI0tMDQpCaW8uUy5sbWVfVFA0X0tMPC1sbWVyKEFGRFdfbWcuY20yX1N+T3JpZ2luKygxfEdlbm90eXBlKSwgZGF0YT1Db3JhbC5UUDRbd2hpY2goQ29yYWwuVFA0JFNpdGU9PSJLTCIpLF0pDQpzdW1tYXJ5KEJpby5TLmxtZV9UUDRfS0wpDQpldGFfc3F1YXJlZChCaW8uUy5sbWVfVFA0X0tMKQ0KDQojI1NTDQpCaW8uUy5sbWVfVFA0X1NTPC1sbWVyKEFGRFdfbWcuY20yX1N+T3JpZ2luKygxfEdlbm90eXBlKSwgZGF0YT1Db3JhbC5UUDRbd2hpY2goQ29yYWwuVFA0JFNpdGU9PSJTUyIpLF0pDQpzdW1tYXJ5KEJpby5TLmxtZV9UUDRfU1MpDQpldGFfc3F1YXJlZChCaW8uUy5sbWVfVFA0X1NTKQ0KDQpgYGANCg0KDQpgYGB7ciBQbG90IEJpb21hc3MgU3ltYmlvbnQgVFA0fQ0KIyNTdW1tYXJ5IHN0YXRpc3RpY3MgYnkgU2l0ZSBhbmQgT3JpZ2luDQpUUDRfQmlvU3ltLnN1bTwtc3VtbWFyeVNFKENvcmFsLlRQNCwgbWVhc3VyZXZhcj0iQUZEV19tZy5jbTJfUyIsIGdyb3VwdmFycz1jKCJTaXRlIiwgIk9yaWdpbiIsICJTaXRlLk9yaWciKSwgbmEucm09VFJVRSkNCg0KIyNQbG90IEF2ZXJhZ2UgU3ltYmlvbnQgQmlvbWFzcyBhY3Jvc3MgVHJlYXRtZW50cw0KVFA0X0Jpb1N5bS5wbG90PC1nZ3Bsb3QoVFA0X0Jpb1N5bS5zdW0sIGFlcyh4PVNpdGUsIHk9QUZEV19tZy5jbTJfUywgY29sb3VyPVNpdGUuT3JpZykpICsgDQogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPU9yaWcuY29sb3JzLm8pKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUFGRFdfbWcuY20yX1Mtc2UsIHltYXg9QUZEV19tZy5jbTJfUytzZSksIHdpZHRoPWNhcC5zeiwgbGluZXdpZHRoPWJhci5zeiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC41KSkgKw0KICBnZW9tX3BvaW50KHNpemU9cG9pbnQuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCANCiAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9bGVnLnR4dC5zeiksIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT1sZWcudGl0bGUuc3opLCANCiAgICAgICAgbGVnZW5kLmJveC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yID0gImJsYWNrIikpKw0KICBsYWJzKHg9IlNpdGUgYW5kIE9yaWdpbiIsIHk9ZXhwcmVzc2lvbihwYXN0ZSgnU3ltYmlvbnQgQmlvbWFzcyAobWcgY20nXi0yKiIpIikpLCBjb2xvdXI9Ik9yaWdpbiIpKw0KICB5bGltKDAsIDEpOyBUUDRfQmlvU3ltLnBsb3QNCmBgYA0KDQoNCiMjIyMgQ2hsb3JvcGh5bGwNCmBgYHtyfQ0KIyNDaGVjayBub3JtYWxpdHkNCmhpc3QoQ29yYWwuVFA0JENobF91Zy5jbTIpDQpzaGFwaXJvLnRlc3QoQ29yYWwuVFA0JENobF91Zy5jbTIpDQojU2xpZ2h0bHkgbm9uIG5vcm1hbA0KDQpoaXN0KGxvZyhDb3JhbC5UUDQkQ2hsX3VnLmNtMisxKSkNCnNoYXBpcm8udGVzdChsb2coQ29yYWwuVFA0JENobF91Zy5jbTIrMSkpDQojTm9ybWFsDQoNCiMjTW9kZWwNCiNGdW5jdGlvbiBvZiBTaXRlIGFuZCBPcmlnaW4sIHdpdGggR2Vub3R5cGUgYXMgYSBSYW5kb20gZWZmZWN0DQojSW50ZXJhY3Rpb25zIGJldHdlZW4gT3JpZ2luIGFuZCBTaXRlDQpDaGwubG1lX1RQNDwtbG1lcihsb2coQ2hsX3VnLmNtMisxKX5PcmlnaW4qU2l0ZSsoMXxHZW5vdHlwZSksIGRhdGE9Q29yYWwuVFA0KQ0KDQojI0NoZWNrIHJlc2lkdWFscw0KQ2hsLmxtZV9yZXNfVFA0IDwtIHNpbXVsYXRlUmVzaWR1YWxzKGZpdHRlZE1vZGVsID0gQ2hsLmxtZV9UUDQsIHBsb3QgPSBGKQ0KcGxvdChDaGwubG1lX3Jlc19UUDQpDQoNCiMjTW9kZWwgcmVzdWx0cw0Kc3VtbWFyeShDaGwubG1lX1RQNCkNCg0KZXRhX3NxdWFyZWQoQ2hsLmxtZV9UUDQpDQoNCmBgYA0KDQoNCkVmZmVjdCBzaXplIG9mIE9yaWdpbiBmb3IgZWFjaCBTaXRlDQpgYGB7cn0NCg0KIyNLTA0KQ2hsLmxtZV9UUDRfS0w8LWxtZXIobG9nKENobF91Zy5jbTIrMSl+T3JpZ2luKygxfEdlbm90eXBlKSwgZGF0YT1Db3JhbC5UUDRbd2hpY2goQ29yYWwuVFA0JFNpdGU9PSJLTCIpLF0pDQpzdW1tYXJ5KENobC5sbWVfVFA0X0tMKQ0KZXRhX3NxdWFyZWQoQ2hsLmxtZV9UUDRfS0wpDQoNCg0KIyNTUw0KQ2hsLmxtZV9UUDRfU1M8LWxtZXIobG9nKENobF91Zy5jbTIrMSl+T3JpZ2luKygxfEdlbm90eXBlKSwgZGF0YT1Db3JhbC5UUDRbd2hpY2goQ29yYWwuVFA0JFNpdGU9PSJTUyIpLF0pDQpzdW1tYXJ5KENobC5sbWVfVFA0X1NTKQ0KZXRhX3NxdWFyZWQoQ2hsLmxtZV9UUDRfU1MpDQoNCmBgYA0KDQoNCmBgYHtyIFBsb3QgQ2hsb3JvcGh5bGwgVFA0fQ0KIyNTdW1tYXJ5IHN0YXRpc3RpY3MgYnkgU2l0ZSBhbmQgT3JpZ2luDQpUUDRfQ2hsLnN1bTwtc3VtbWFyeVNFKENvcmFsLlRQNCwgbWVhc3VyZXZhcj0iQ2hsX3VnLmNtMiIsIGdyb3VwdmFycz1jKCJTaXRlIiwgIk9yaWdpbiIsICJTaXRlLk9yaWciKSwgbmEucm09VFJVRSkNCg0KIyNQbG90IEF2ZXJhZ2UgQ2hsb3JvcGh5bGwgYWNyb3NzIFRyZWF0bWVudHMNClRQNF9DaGwucGxvdDwtZ2dwbG90KFRQNF9DaGwuc3VtLCBhZXMoeD1TaXRlLCB5PUNobF91Zy5jbTIsIGNvbG91cj1TaXRlLk9yaWcpKSArIA0KICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1PcmlnLmNvbG9ycy5vKSsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1DaGxfdWcuY20yLXNlLCB5bWF4PUNobF91Zy5jbTIrc2UpLCB3aWR0aD1jYXAuc3osIGxpbmV3aWR0aD1iYXIuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpICsNCiAgZ2VvbV9wb2ludChzaXplPXBvaW50LnN6LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCANCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgDQogICAgICAgIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPWxlZy50eHQuc3opLCBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9bGVnLnRpdGxlLnN6KSwgDQogICAgICAgIGxlZ2VuZC5ib3guYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9ICJibGFjayIpKSsNCiAgbGFicyh4PSJTaXRlIGFuZCBPcmlnaW4iLCB5PWV4cHJlc3Npb24ocGFzdGUoJ1RvdGFsIENobG9yb3BoeWxsIChcdTAzQkNnIGNtJ14tMioiKSIpKSwgY29sb3VyPSJPcmlnaW4iKSsNCiAgeWxpbSgwLCAzLjUpOyBUUDRfQ2hsLnBsb3QNCmBgYA0KDQoNCiMjIyBFZmZlY3QgU2l6ZSBvdmVyIFRpbWUNCg0KYGBge3J9DQojI0RhdGFmcmFtZSBvZiBlZmZlY3Qgc2l6ZSByZXN1bHRzDQpQaHlzLkVTPC1kYXRhLmZyYW1lKFRpbWVQPWMocmVwKCJUUDEiLDgpLCByZXAoIlRQMiIsOCksIHJlcCgiVFAzIiw4KSwgcmVwKCJUUDQiLDgpKSwgDQogICAgICAgICAgICAgICAgICAgIFNpdGU9YyhyZXAoYygiS0wiLCAiU1MiKSwxNikpLA0KICAgICAgICAgICAgICAgICAgICBNZXRyaWM9YyhyZXAoYygiQUZEV19tZy5jbTJfQyIsICJBRkRXX21nLmNtMl9DIiwgIkFGRFdfbWcuY20yX1MiLCAiQUZEV19tZy5jbTJfUyIsICJUUF91Zy5jbTJfUyIsICJUUF91Zy5jbTJfUyIsICJDaGxfdWcuY20yIiwgIkNobF91Zy5jbTIiKSw0KSksDQogICAgICAgICAgICAgICAgICAgIEV0YVNxPWMoZXRhX3NxdWFyZWQoQmlvLkMubG1lX1RQMV9LTCkkRXRhMl9wYXJ0aWFsLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldGFfc3F1YXJlZChCaW8uQy5sbWVfVFAxX1NTKSRFdGEyX3BhcnRpYWwsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV0YV9zcXVhcmVkKEJpby5TLmxtZV9UUDFfS0wpJEV0YTJfcGFydGlhbCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXRhX3NxdWFyZWQoQmlvLlMubG1lX1RQMV9TUykkRXRhMl9wYXJ0aWFsLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldGFfc3F1YXJlZChQcm90LlMubG1lX1RQMV9LTCkkRXRhMl9wYXJ0aWFsLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldGFfc3F1YXJlZChQcm90LlMubG1lX1RQMV9TUykkRXRhMl9wYXJ0aWFsLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXRhX3NxdWFyZWQoQ2hsLmxtZV9UUDFfS0wpJEV0YTJfcGFydGlhbCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXRhX3NxdWFyZWQoQ2hsLmxtZV9UUDFfU1MpJEV0YTJfcGFydGlhbCwgDQogICAgICAgICAgICAgICAgICAgICAgZXRhX3NxdWFyZWQoQmlvLkMubG1lX1RQMl9LTCkkRXRhMl9wYXJ0aWFsLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldGFfc3F1YXJlZChCaW8uQy5sbWVfVFAyX1NTKSRFdGEyX3BhcnRpYWwsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV0YV9zcXVhcmVkKEJpby5TLmxtZV9UUDJfS0wpJEV0YTJfcGFydGlhbCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXRhX3NxdWFyZWQoQmlvLlMubG1lX1RQMl9TUykkRXRhMl9wYXJ0aWFsLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldGFfc3F1YXJlZChQcm90LlMubG1lX1RQMl9LTCkkRXRhMl9wYXJ0aWFsLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldGFfc3F1YXJlZChQcm90LlMubG1lX1RQMl9TUykkRXRhMl9wYXJ0aWFsLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXRhX3NxdWFyZWQoQ2hsLmxtZV9UUDJfS0wpJEV0YTJfcGFydGlhbCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXRhX3NxdWFyZWQoQ2hsLmxtZV9UUDJfU1MpJEV0YTJfcGFydGlhbCwgDQogICAgICAgICAgICAgICAgICAgICAgICBldGFfc3F1YXJlZChCaW8uQy5sbWVfVFAzX0tMKSRFdGEyX3BhcnRpYWwsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV0YV9zcXVhcmVkKEJpby5DLmxtZV9UUDNfU1MpJEV0YTJfcGFydGlhbCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXRhX3NxdWFyZWQoQmlvLlMubG1lX1RQM19LTCkkRXRhMl9wYXJ0aWFsLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldGFfc3F1YXJlZChCaW8uUy5sbWVfVFAzX1NTKSRFdGEyX3BhcnRpYWwsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV0YV9zcXVhcmVkKFByb3QuUy5sbWVfVFAzX0tMKSRFdGEyX3BhcnRpYWwsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV0YV9zcXVhcmVkKFByb3QuUy5sbWVfVFAzX1NTKSRFdGEyX3BhcnRpYWwsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldGFfc3F1YXJlZChDaGwubG1lX1RQM19LTCkkRXRhMl9wYXJ0aWFsLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldGFfc3F1YXJlZChDaGwubG1lX1RQM19TUykkRXRhMl9wYXJ0aWFsLCANCiAgICAgICAgICAgICAgICAgICAgICBldGFfc3F1YXJlZChCaW8uQy5sbWVfVFA0X0tMKSRFdGEyX3BhcnRpYWwsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV0YV9zcXVhcmVkKEJpby5DLmxtZV9UUDRfU1MpJEV0YTJfcGFydGlhbCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXRhX3NxdWFyZWQoQmlvLlMubG1lX1RQNF9LTCkkRXRhMl9wYXJ0aWFsLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldGFfc3F1YXJlZChCaW8uUy5sbWVfVFA0X1NTKSRFdGEyX3BhcnRpYWwsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV0YV9zcXVhcmVkKFByb3QuUy5sbWVfVFA0X0tMKSRFdGEyX3BhcnRpYWwsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV0YV9zcXVhcmVkKFByb3QuUy5sbWVfVFA0X1NTKSRFdGEyX3BhcnRpYWwsIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldGFfc3F1YXJlZChDaGwubG1lX1RQNF9LTCkkRXRhMl9wYXJ0aWFsLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldGFfc3F1YXJlZChDaGwubG1lX1RQNF9TUykkRXRhMl9wYXJ0aWFsKSwNCiAgICAgICAgICAgICAgICAgICAgUHZhbHVlPWMoc3VtbWFyeShCaW8uQy5sbWVfVFAxX0tMKSRjb2VmZmljaWVudHNbMTBdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5KEJpby5DLmxtZV9UUDFfU1MpJGNvZWZmaWNpZW50c1sxMF0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnkoQmlvLlMubG1lX1RQMV9LTCkkY29lZmZpY2llbnRzWzEwXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeShCaW8uUy5sbWVfVFAxX1NTKSRjb2VmZmljaWVudHNbMTBdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5KFByb3QuUy5sbWVfVFAxX0tMKSRjb2VmZmljaWVudHNbMTBdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5KFByb3QuUy5sbWVfVFAxX1NTKSRjb2VmZmljaWVudHNbMTBdLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeShDaGwubG1lX1RQMV9LTCkkY29lZmZpY2llbnRzWzEwXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeShDaGwubG1lX1RQMV9TUykkY29lZmZpY2llbnRzWzEwXSwgDQogICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeShCaW8uQy5sbWVfVFAyX0tMKSRjb2VmZmljaWVudHNbMTBdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5KEJpby5DLmxtZV9UUDJfU1MpJGNvZWZmaWNpZW50c1sxMF0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnkoQmlvLlMubG1lX1RQMl9LTCkkY29lZmZpY2llbnRzWzEwXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeShCaW8uUy5sbWVfVFAyX1NTKSRjb2VmZmljaWVudHNbMTBdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5KFByb3QuUy5sbWVfVFAyX0tMKSRjb2VmZmljaWVudHNbMTBdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5KFByb3QuUy5sbWVfVFAyX1NTKSRjb2VmZmljaWVudHNbMTBdLCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeShDaGwubG1lX1RQMl9LTCkkY29lZmZpY2llbnRzWzEwXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeShDaGwubG1lX1RQMl9TUykkY29lZmZpY2llbnRzWzEwXSwgDQogICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5KEJpby5DLmxtZV9UUDNfS0wpJGNvZWZmaWNpZW50c1sxMF0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnkoQmlvLkMubG1lX1RQM19TUykkY29lZmZpY2llbnRzWzEwXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeShCaW8uUy5sbWVfVFAzX0tMKSRjb2VmZmljaWVudHNbMTBdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5KEJpby5TLmxtZV9UUDNfU1MpJGNvZWZmaWNpZW50c1sxMF0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnkoUHJvdC5TLmxtZV9UUDNfS0wpJGNvZWZmaWNpZW50c1sxMF0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnkoUHJvdC5TLmxtZV9UUDNfU1MpJGNvZWZmaWNpZW50c1sxMF0sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5KENobC5sbWVfVFAzX0tMKSRjb2VmZmljaWVudHNbMTBdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5KENobC5sbWVfVFAzX1NTKSRjb2VmZmljaWVudHNbMTBdLCANCiAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5KEJpby5DLmxtZV9UUDRfS0wpJGNvZWZmaWNpZW50c1sxMF0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnkoQmlvLkMubG1lX1RQNF9TUykkY29lZmZpY2llbnRzWzEwXSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeShCaW8uUy5sbWVfVFA0X0tMKSRjb2VmZmljaWVudHNbMTBdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5KEJpby5TLmxtZV9UUDRfU1MpJGNvZWZmaWNpZW50c1sxMF0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnkoUHJvdC5TLmxtZV9UUDRfS0wpJGNvZWZmaWNpZW50c1sxMF0sDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnkoUHJvdC5TLmxtZV9UUDRfU1MpJGNvZWZmaWNpZW50c1sxMF0sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5KENobC5sbWVfVFA0X0tMKSRjb2VmZmljaWVudHNbMTBdLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5KENobC5sbWVfVFA0X1NTKSRjb2VmZmljaWVudHNbMTBdKSkNCg0KDQoNClBoeXMuRVMkU2lnPC1pZmVsc2UoUGh5cy5FUyRQdmFsdWU8MC4wMDEsICIqKioiLCBpZmVsc2UoUGh5cy5FUyRQdmFsdWU8MC4wMSwgIioqIiwgaWZlbHNlKFBoeXMuRVMkUHZhbHVlPDAuMDUsICIqIiwgaWZlbHNlKFBoeXMuRVMkUHZhbHVlPDAuMSwgIi0iLCBOQSkpKSkNCmBgYA0KDQoNCiMjIyMgSG9zdCBCaW9tYXNzDQpgYGB7ciBQbG90IEVmZmVjdCBTaXplIEhvc3QgQmlvbWFzc30NCkJpby5DLkVTLnBsb3Q8LWdncGxvdChQaHlzLkVTW3doaWNoKFBoeXMuRVMkTWV0cmljPT0iQUZEV19tZy5jbTJfQyIpLF0sIGFlcyh4PVRpbWVQLCB5PUV0YVNxLCBmaWxsPVNpdGUpKSsNCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpKSsNCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9U2l0ZS5jb2xvcnMubykrDQp0aGVtZV9jbGFzc2ljKCkrDQogIGdndGl0bGUoIkhvc3QgQmlvbWFzcyIpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG91cj0iYmxhY2siLCBzaXplPXBhbmVsLmxhYi5zeiwgaGp1c3Q9MC41KSwgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgDQogICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPWxlZy50eHQuc3opLCBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9bGVnLnRpdGxlLnN6KSwgDQogICAgICAgIGxlZ2VuZC5ib3guYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9ICJibGFjayIpKSsNCiAgIGxhYnMoeD0iVGltZSBQb2ludCIsIHk9ZXhwcmVzc2lvbihwYXN0ZSgiRWZmZWN0IFNpemUgKHAiLCBldGFeMiwgIikiKSksIGNvbG91cj0iU2l0ZSIpKw0KICB5bGltKDAsIDAuNikrDQogIGdlb21fdGV4dChhZXMobGFiZWw9U2lnKSwgdmp1c3Q9LTAuMDIsIGNvbG9yPSJibGFjayIsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuOSksIHNpemU9bGV2ZWxzLnN6LCBmb250ZmFjZT0iYm9sZCIpOyBCaW8uQy5FUy5wbG90DQoNCmBgYA0KDQojIyMjIFN5bWJpb250IEJpb21hc3MNCmBgYHtyIFBsb3QgRWZmZWN0IFNpemUgU3ltYmlvbnQgQmlvbWFzc30NCkJpby5TLkVTLnBsb3Q8LWdncGxvdChQaHlzLkVTW3doaWNoKFBoeXMuRVMkTWV0cmljPT0iQUZEV19tZy5jbTJfUyIpLF0sIGFlcyh4PVRpbWVQLCB5PUV0YVNxLCBmaWxsPVNpdGUpKSsNCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpKSsNCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9U2l0ZS5jb2xvcnMubykrDQp0aGVtZV9jbGFzc2ljKCkrDQogIGdndGl0bGUoIlN5bWJpb250IEJpb21hc3MiKSsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvdXI9ImJsYWNrIiwgc2l6ZT1wYW5lbC5sYWIuc3osIGhqdXN0PTAuNSksIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT1sZWcudHh0LnN6KSwgbGVnZW5kLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPWxlZy50aXRsZS5zeiksIA0KICAgICAgICBsZWdlbmQuYm94LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3IgPSAiYmxhY2siKSkrDQogICBsYWJzKHg9IlRpbWUgUG9pbnQiLCB5PWV4cHJlc3Npb24ocGFzdGUoIkVmZmVjdCBTaXplIChwIiwgZXRhXjIsICIpIikpLCBjb2xvdXI9IlNpdGUiKSsNCiAgeWxpbSgwLCAwLjYpKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsPVNpZyksIHZqdXN0PS0wLjAyLCBjb2xvcj0iYmxhY2siLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjkpLCBzaXplPWxldmVscy5zeiwgZm9udGZhY2U9ImJvbGQiKTsgQmlvLlMuRVMucGxvdA0KDQpgYGANCg0KDQojIyMjIFN5bWJpb250IFByb3RlaW4NCmBgYHtyIFBsb3QgRWZmZWN0IFNpemUgU3ltYmlvbnQgUHJvdGVpbn0NClByb3QuUy5FUy5wbG90PC1nZ3Bsb3QoUGh5cy5FU1t3aGljaChQaHlzLkVTJE1ldHJpYz09IlRQX3VnLmNtMl9TIiksXSwgYWVzKHg9VGltZVAsIHk9RXRhU3EsIGZpbGw9U2l0ZSkpKw0KICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKCkpKw0KICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1TaXRlLmNvbG9ycy5vKSsNCnRoZW1lX2NsYXNzaWMoKSsNCiAgZ2d0aXRsZSgiU3ltYmlvbnQgUHJvdGVpbiIpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG91cj0iYmxhY2siLCBzaXplPXBhbmVsLmxhYi5zeiwgaGp1c3Q9MC41KSwgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgDQogICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPWxlZy50eHQuc3opLCBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9bGVnLnRpdGxlLnN6KSwgDQogICAgICAgIGxlZ2VuZC5ib3guYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9ICJibGFjayIpKSsNCiAgIGxhYnMoeD0iVGltZSBQb2ludCIsIHk9ZXhwcmVzc2lvbihwYXN0ZSgiRWZmZWN0IFNpemUgKHAiLCBldGFeMiwgIikiKSksIGNvbG91cj0iU2l0ZSIpKw0KICB5bGltKDAsIDAuNikrDQogIGdlb21fdGV4dChhZXMobGFiZWw9U2lnKSwgdmp1c3Q9LTAuMDIsIGNvbG9yPSJibGFjayIsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuOSksIHNpemU9bGV2ZWxzLnN6LCBmb250ZmFjZT0iYm9sZCIpOyBQcm90LlMuRVMucGxvdA0KDQpgYGANCg0KDQojIyMjIENobG9yb3BoeWxsDQpgYGB7ciBQbG90IEVmZmVjdCBTaXplIENobG9yb3BoeWxsfQ0KQ2hsLkVTLnBsb3Q8LWdncGxvdChQaHlzLkVTW3doaWNoKFBoeXMuRVMkTWV0cmljPT0iQ2hsX3VnLmNtMiIpLF0sIGFlcyh4PVRpbWVQLCB5PUV0YVNxLCBmaWxsPVNpdGUpKSsNCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpKSsNCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9U2l0ZS5jb2xvcnMubykrDQp0aGVtZV9jbGFzc2ljKCkrDQogIGdndGl0bGUoIkNobG9yb3BoeWxsIikrDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3VyPSJibGFjayIsIHNpemU9cGFuZWwubGFiLnN6LCBoanVzdD0wLjUpLCBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCANCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9bGVnLnR4dC5zeiksIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT1sZWcudGl0bGUuc3opLCANCiAgICAgICAgbGVnZW5kLmJveC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yID0gImJsYWNrIikpKw0KICAgbGFicyh4PSJUaW1lIFBvaW50IiwgeT1leHByZXNzaW9uKHBhc3RlKCJFZmZlY3QgU2l6ZSAocCIsIGV0YV4yLCAiKSIpKSwgY29sb3VyPSJTaXRlIikrDQogIHlsaW0oMCwgMC42KSsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1TaWcpLCB2anVzdD0tMC4wMiwgY29sb3I9ImJsYWNrIiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC45KSwgc2l6ZT1sZXZlbHMuc3osIGZvbnRmYWNlPSJib2xkIik7IENobC5FUy5wbG90DQoNCmBgYA0KDQoNCiMgRmlndXJlcw0KDQojIyMgRmlndXJlIDIgUGh5c2lvbG9neSBFZmZlY3QgU2l6ZQ0KDQojIyMjIEFkanVzdCBGaWd1cmVzIGZvciBQYW5lbA0KYGBge3J9DQojI0hvc3QgQmlvbWFzcw0KQmlvLkMuRVMucGxvdC5jdXQ8LWdncGxvdChQaHlzLkVTW3doaWNoKFBoeXMuRVMkTWV0cmljPT0iQUZEV19tZy5jbTJfQyIpLF0sIGFlcyh4PVRpbWVQLCB5PUV0YVNxLCBmaWxsPVNpdGUpKSsNCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpKSsNCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9U2l0ZS5jb2xvcnMubykrDQp0aGVtZV9jbGFzc2ljKCkrDQogIGdndGl0bGUoIkhvc3QgQmlvbWFzcyIpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG91cj0iYmxhY2siLCBzaXplPXBhbmVsLmxhYi5zeiwgaGp1c3Q9MC41KSwgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgDQogICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIGxlZ2VuZC50ZXh0PWVsZW1lbnRfdGV4dChzaXplPWxlZy50eHQuc3opLCBsZWdlbmQudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9bGVnLnRpdGxlLnN6KSwgDQogICAgICAgIGxlZ2VuZC5ib3guYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9ICJibGFjayIpLCBsZWdlbmQucG9zaXRpb249YygwLjE1LCAwLjgpKSsNCiAgIGxhYnMoeD0iIiwgeT1leHByZXNzaW9uKHBhc3RlKCJFZmZlY3QgU2l6ZSAocCIsIGV0YV4yLCAiKSIpKSwgY29sb3VyPSJTaXRlIikrDQogIHlsaW0oMCwgMC42KSsNCiAgZ2VvbV90ZXh0KGFlcyhsYWJlbD1TaWcpLCB2anVzdD0tMC4wMiwgY29sb3I9ImJsYWNrIiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoMC45KSwgc2l6ZT1sZXZlbHMuc3osIGZvbnRmYWNlPSJib2xkIikNCg0KIyNTeW1iaW9udCBCaW9tYXNzDQpCaW8uUy5FUy5wbG90LmN1dDwtZ2dwbG90KFBoeXMuRVNbd2hpY2goUGh5cy5FUyRNZXRyaWM9PSJBRkRXX21nLmNtMl9TIiksXSwgYWVzKHg9VGltZVAsIHk9RXRhU3EsIGZpbGw9U2l0ZSkpKw0KICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKCkpKw0KICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1TaXRlLmNvbG9ycy5vKSsNCnRoZW1lX2NsYXNzaWMoKSsNCiAgZ2d0aXRsZSgiU3ltYmlvbnQgQmlvbWFzcyIpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG91cj0iYmxhY2siLCBzaXplPXBhbmVsLmxhYi5zeiwgaGp1c3Q9MC41KSwgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgDQogICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKw0KICAgbGFicyh4PSIiLCB5PSIiLCBjb2xvdXI9IlNpdGUiKSsNCiAgeWxpbSgwLCAwLjYpKw0KICBnZW9tX3RleHQoYWVzKGxhYmVsPVNpZyksIHZqdXN0PS0wLjAyLCBjb2xvcj0iYmxhY2siLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgwLjkpLCBzaXplPWxldmVscy5zeiwgZm9udGZhY2U9ImJvbGQiKQ0KDQojI1N5bWJpb250IFByb3RlaW4NClByb3QuUy5FUy5wbG90LmN1dDwtZ2dwbG90KFBoeXMuRVNbd2hpY2goUGh5cy5FUyRNZXRyaWM9PSJUUF91Zy5jbTJfUyIpLF0sIGFlcyh4PVRpbWVQLCB5PUV0YVNxLCBmaWxsPVNpdGUpKSsNCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiLCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpKSsNCiAgICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9U2l0ZS5jb2xvcnMubykrDQp0aGVtZV9jbGFzc2ljKCkrDQogIGdndGl0bGUoIlN5bWJpb250IFByb3RlaW4iKSsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvdXI9ImJsYWNrIiwgc2l6ZT1wYW5lbC5sYWIuc3osIGhqdXN0PTAuNSksIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCBsZWdlbmQucG9zaXRpb249Im5vbmUiKSsNCiAgIGxhYnMoeD0iVGltZSBQb2ludCIsIHk9ZXhwcmVzc2lvbihwYXN0ZSgiRWZmZWN0IFNpemUgKHAiLCBldGFeMiwgIikiKSksIGNvbG91cj0iU2l0ZSIpKw0KICB5bGltKDAsIDAuNikrDQogIGdlb21fdGV4dChhZXMobGFiZWw9U2lnKSwgdmp1c3Q9LTAuMDIsIGNvbG9yPSJibGFjayIsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuOSksIHNpemU9bGV2ZWxzLnN6LCBmb250ZmFjZT0iYm9sZCIpDQoNCiMjQ2hsb3JvcGh5bGwNCkNobC5FUy5wbG90LmN1dDwtZ2dwbG90KFBoeXMuRVNbd2hpY2goUGh5cy5FUyRNZXRyaWM9PSJDaGxfdWcuY20yIiksXSwgYWVzKHg9VGltZVAsIHk9RXRhU3EsIGZpbGw9U2l0ZSkpKw0KICBnZW9tX2JhcihzdGF0PSJpZGVudGl0eSIsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKCkpKw0KICAgIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1TaXRlLmNvbG9ycy5vKSsNCnRoZW1lX2NsYXNzaWMoKSsNCiAgZ2d0aXRsZSgiQ2hsb3JvcGh5bGwiKSsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvdXI9ImJsYWNrIiwgc2l6ZT1wYW5lbC5sYWIuc3osIGhqdXN0PTAuNSksIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCBsZWdlbmQucG9zaXRpb249Im5vbmUiKSsNCiAgIGxhYnMoeD0iVGltZSBQb2ludCIsIHk9IiIsIGNvbG91cj0iU2l0ZSIpKw0KICB5bGltKDAsIDAuNikrDQogIGdlb21fdGV4dChhZXMobGFiZWw9U2lnKSwgdmp1c3Q9LTAuMDIsIGNvbG9yPSJibGFjayIsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKDAuOSksIHNpemU9bGV2ZWxzLnN6LCBmb250ZmFjZT0iYm9sZCIpDQoNCg0KYGBgDQoNCg0KIyMjIyBGaWd1cmUgMg0KYGBge3J9DQojI0NyZWF0ZSBQYW5lbA0KUGh5c0VTX2ZpZzwtcGxvdF9ncmlkKEJpby5DLkVTLnBsb3QuY3V0LCBCaW8uUy5FUy5wbG90LmN1dCwgDQogICAgICAgICAgICAgICAgICAgICAgUHJvdC5TLkVTLnBsb3QuY3V0LCBDaGwuRVMucGxvdC5jdXQsDQogICAgICAgICAgICAgICAgICAgIHJlbF93aWR0aHM9YygwLjksIDEsIDAuOSwgMSksIA0KICAgICAgICAgICAgICAgICAgICByZWxfaGVpZ2h0cyA9IGMoMSwgMSwgMSwgMSksDQogICAgICAgICAgICAgICAgICAgIG5yb3c9MiwgbmNvbD0yLCBieXJvdz1ULCBsYWJlbHMgPSBjKCJBIiwgIkIiLCAiQyIsICJEIikpDQoNCiMjU2F2ZSBGaWd1cmUNCmdnc2F2ZShmaWxlbmFtZT0iRmlndXJlcy8wMl9QaHlzaW9sb2d5L0ZpZzJfUGh5c2lvbG9neUVmZmVjdFNpemVzLnBuZyIsIHBsb3Q9UGh5c0VTX2ZpZywgZHBpPTMwMCwgd2lkdGg9MTAsIGhlaWdodD04LCB1bml0cz0iaW4iKQ0KDQpgYGANCg0KDQojIyMgRmlndXJlIFMzIFVuaXZhcmlhdGUgUGFuZWxzDQoNCiMjIyMgQWRqdXN0IEZpZ3VyZXMgZm9yIFBhbmVsDQpgYGB7cn0NCg0KIyNCaW9tYXNzIEhvc3QNClRQMV9CaW9Ib3N0LnBsb3QuY3V0PC1nZ3Bsb3QoVFAxX0Jpb0hvc3Quc3VtLCBhZXMoeD1TaXRlLCB5PUFGRFdfbWcuY20yX0MsIGNvbG91cj1TaXRlLk9yaWcpKSArIA0KICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1PcmlnLmNvbG9ycy5vKSsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1BRkRXX21nLmNtMl9DLXNlLCB5bWF4PUFGRFdfbWcuY20yX0Mrc2UpLCB3aWR0aD1jYXAuc3osIGxpbmV3aWR0aD1iYXIuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpICsNCiAgZ2VvbV9wb2ludChzaXplPXBvaW50LnN6LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICBnZ3RpdGxlKCJUUDEiKSsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvdXI9ImJsYWNrIiwgc2l6ZT1wYW5lbC5sYWIuc3osIGZhY2U9ImJvbGQiLCBoanVzdD0wLjUpLA0KICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCANCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIikrDQogIGxhYnMoeD0iIiwgeT1leHByZXNzaW9uKHBhc3RlKCdIb3N0IEJpb21hc3MgKG1nIGNtJ14tMioiKSIpKSwgY29sb3VyPSJPcmlnaW4iKSsNCiAgeWxpbSgwLjc1LCAxLjUpKw0KICBhbm5vdGF0ZSgidGV4dCIsIHg9MSwgeT0xLjM1LCBsYWJlbD0iKiIsIHNpemU9bGV2ZWxzLnN6LCBmb250ZmFjZT0iYm9sZCIpDQoNCg0KVFAyX0Jpb0hvc3QucGxvdC5jdXQ8LWdncGxvdChUUDJfQmlvSG9zdC5zdW0sIGFlcyh4PVNpdGUsIHk9QUZEV19tZy5jbTJfQywgY29sb3VyPVNpdGUuT3JpZykpICsgDQogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPU9yaWcuY29sb3JzLm8pKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUFGRFdfbWcuY20yX0Mtc2UsIHltYXg9QUZEV19tZy5jbTJfQytzZSksIHdpZHRoPWNhcC5zeiwgbGluZXdpZHRoPWJhci5zeiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC41KSkgKw0KICBnZW9tX3BvaW50KHNpemU9cG9pbnQuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIGdndGl0bGUoIlRQMiIpKw0KICB0aGVtZShwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KGNvbG91cj0iYmxhY2siLCBzaXplPXBhbmVsLmxhYi5zeiwgZmFjZT0iYm9sZCIsIGhqdXN0PTAuNSksDQogICAgICAgIGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCANCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIikrDQogIGxhYnMoeD0iIiwgeT0iIiwgY29sb3VyPSJPcmlnaW4iKSsNCiAgeWxpbSgwLjc1LCAxLjUpKw0KICBhbm5vdGF0ZSgidGV4dCIsIHg9MiwgeT0xLjM1LCBsYWJlbD0iLSIsIHNpemU9bGV2ZWxzLnN6LCBmb250ZmFjZT0iYm9sZCIpDQoNClRQM19CaW9Ib3N0LnBsb3QuY3V0PC1nZ3Bsb3QoVFAzX0Jpb0hvc3Quc3VtLCBhZXMoeD1TaXRlLCB5PUFGRFdfbWcuY20yX0MsIGNvbG91cj1TaXRlLk9yaWcpKSArIA0KICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1PcmlnLmNvbG9ycy5vKSsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1BRkRXX21nLmNtMl9DLXNlLCB5bWF4PUFGRFdfbWcuY20yX0Mrc2UpLCB3aWR0aD1jYXAuc3osIGxpbmV3aWR0aD1iYXIuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpICsNCiAgZ2VvbV9wb2ludChzaXplPXBvaW50LnN6LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICBnZ3RpdGxlKCJUUDMiKSsNCiAgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChjb2xvdXI9ImJsYWNrIiwgc2l6ZT1wYW5lbC5sYWIuc3osIGZhY2U9ImJvbGQiLCBoanVzdD0wLjUpLA0KICAgICAgICBheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCANCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKw0KICBsYWJzKHg9IiIsIHk9IiIsIGNvbG91cj0iT3JpZ2luIikrDQogIHlsaW0oMC43NSwgMS41KQ0KDQpUUDRfQmlvSG9zdC5wbG90LmN1dDwtZ2dwbG90KFRQNF9CaW9Ib3N0LnN1bSwgYWVzKHg9U2l0ZSwgeT1BRkRXX21nLmNtMl9DLCBjb2xvdXI9U2l0ZS5PcmlnKSkgKyANCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9T3JpZy5jb2xvcnMubykrDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49QUZEV19tZy5jbTJfQy1zZSwgeW1heD1BRkRXX21nLmNtMl9DK3NlKSwgd2lkdGg9Y2FwLnN6LCBsaW5ld2lkdGg9YmFyLnN6LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpKSArDQogIGdlb21fcG9pbnQoc2l6ZT1wb2ludC5zeiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC41KSkrDQogIHRoZW1lX2NsYXNzaWMoKSsNCiAgZ2d0aXRsZSgiVFA0IikrDQogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoY29sb3VyPSJibGFjayIsIHNpemU9cGFuZWwubGFiLnN6LCBmYWNlPSJib2xkIiwgaGp1c3Q9MC41KSwNCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgDQogICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIA0KICAgICAgICBsZWdlbmQudGV4dD1lbGVtZW50X3RleHQoc2l6ZT1sZWcudHh0LnN6KSwgbGVnZW5kLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPWxlZy50aXRsZS5zeiksIA0KICAgICAgICBsZWdlbmQuYm94LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3IgPSAiYmxhY2siKSkrDQogIGxhYnMoeD0iIiwgeT0iIiwgY29sb3VyPSJPcmlnaW4iKSsNCiAgeWxpbSgwLjc1LCAxLjUpKw0KICBhbm5vdGF0ZSgidGV4dCIsIHg9MiwgeT0xLjQ1LCBsYWJlbD0iKiIsIHNpemU9bGV2ZWxzLnN6LCBmb250ZmFjZT0iYm9sZCIpDQoNCg0KIyNCaW9tYXNzIFN5bWJpb250DQpUUDFfQmlvU3ltLnBsb3QuY3V0PC1nZ3Bsb3QoVFAxX0Jpb1N5bS5zdW0sIGFlcyh4PVNpdGUsIHk9QUZEV19tZy5jbTJfUywgY29sb3VyPVNpdGUuT3JpZykpICsgDQogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPU9yaWcuY29sb3JzLm8pKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUFGRFdfbWcuY20yX1Mtc2UsIHltYXg9QUZEV19tZy5jbTJfUytzZSksIHdpZHRoPWNhcC5zeiwgbGluZXdpZHRoPWJhci5zeiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC41KSkgKw0KICBnZW9tX3BvaW50KHNpemU9cG9pbnQuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCANCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIikrDQogIGxhYnMoeD0iIiwgeT1leHByZXNzaW9uKHBhc3RlKCdTeW1iaW9udCBCaW9tYXNzIChtZyBjbSdeLTIqIikiKSksIGNvbG91cj0iT3JpZ2luIikrDQogIHlsaW0oMC40NSwgMC45NSkrDQogIGFubm90YXRlKCJ0ZXh0IiwgeD0yLCB5PTAuODIsIGxhYmVsPSIqKiIsIHNpemU9bGV2ZWxzLnN6LCBmb250ZmFjZT0iYm9sZCIpDQoNCg0KVFAyX0Jpb1N5bS5wbG90LmN1dDwtZ2dwbG90KFRQMl9CaW9TeW0uc3VtLCBhZXMoeD1TaXRlLCB5PUFGRFdfbWcuY20yX1MsIGNvbG91cj1TaXRlLk9yaWcpKSArIA0KICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1PcmlnLmNvbG9ycy5vKSsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1BRkRXX21nLmNtMl9TLXNlLCB5bWF4PUFGRFdfbWcuY20yX1Mrc2UpLCB3aWR0aD1jYXAuc3osIGxpbmV3aWR0aD1iYXIuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpICsNCiAgZ2VvbV9wb2ludChzaXplPXBvaW50LnN6LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCANCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKw0KICBsYWJzKHg9IiIsIHk9IiIsIGNvbG91cj0iT3JpZ2luIikrDQogIHlsaW0oMC40NSwgMC45NSkrDQogIGFubm90YXRlKCJ0ZXh0IiwgeD0xLCB5PTAuODIsIGxhYmVsPSIqIiwgc2l6ZT1sZXZlbHMuc3osIGZvbnRmYWNlPSJib2xkIikNCg0KDQpUUDNfQmlvU3ltLnBsb3QuY3V0PC1nZ3Bsb3QoVFAzX0Jpb1N5bS5zdW0sIGFlcyh4PVNpdGUsIHk9QUZEV19tZy5jbTJfUywgY29sb3VyPVNpdGUuT3JpZykpICsgDQogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPU9yaWcuY29sb3JzLm8pKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUFGRFdfbWcuY20yX1Mtc2UsIHltYXg9QUZEV19tZy5jbTJfUytzZSksIHdpZHRoPWNhcC5zeiwgbGluZXdpZHRoPWJhci5zeiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC41KSkgKw0KICBnZW9tX3BvaW50KHNpemU9cG9pbnQuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCANCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIikrDQogIGxhYnMoeD0iIiwgeT0iIiwgY29sb3VyPSJPcmlnaW4iKSsNCiAgeWxpbSgwLjQ1LCAwLjk1KQ0KDQpUUDRfQmlvU3ltLnBsb3QuY3V0PC1nZ3Bsb3QoVFA0X0Jpb1N5bS5zdW0sIGFlcyh4PVNpdGUsIHk9QUZEV19tZy5jbTJfUywgY29sb3VyPVNpdGUuT3JpZykpICsgDQogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPU9yaWcuY29sb3JzLm8pKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUFGRFdfbWcuY20yX1Mtc2UsIHltYXg9QUZEV19tZy5jbTJfUytzZSksIHdpZHRoPWNhcC5zeiwgbGluZXdpZHRoPWJhci5zeiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC41KSkgKw0KICBnZW9tX3BvaW50KHNpemU9cG9pbnQuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCANCiAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9bGVnLnR4dC5zeiksIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT1sZWcudGl0bGUuc3opLCANCiAgICAgICAgbGVnZW5kLmJveC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yID0gImJsYWNrIikpKw0KICBsYWJzKHg9IiIsIHk9IiIsIGNvbG91cj0iT3JpZ2luIikrDQogIHlsaW0oMC40NSwgMC45NSkNCg0KDQojI1Byb3RlaW4gU3ltYmlvbnQNClRQMV9Qcm90U3ltLnBsb3QuY3V0PC1nZ3Bsb3QoVFAxX1Byb3RTeW0uc3VtLCBhZXMoeD1TaXRlLCB5PVRQX3VnLmNtMl9TLCBjb2xvdXI9U2l0ZS5PcmlnKSkgKyANCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9T3JpZy5jb2xvcnMubykrDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49VFBfdWcuY20yX1Mtc2UsIHltYXg9VFBfdWcuY20yX1Mrc2UpLCB3aWR0aD1jYXAuc3osIGxpbmV3aWR0aD1iYXIuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpICsNCiAgZ2VvbV9wb2ludChzaXplPXBvaW50LnN6LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCANCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKw0KICBsYWJzKHg9IiIsIHk9ZXhwcmVzc2lvbihwYXN0ZSgnU3ltYmlvbnQgUHJvdGVpbiAoXHUwM0JDZyBjbSdeLTIqIikiKSksIGNvbG91cj0iT3JpZ2luIikrDQogIHlsaW0oMjUwLCA1NTApKw0KICBhbm5vdGF0ZSgidGV4dCIsIHg9MiwgeT01MzUsIGxhYmVsPSIqKiIsIHNpemU9bGV2ZWxzLnN6LCBmb250ZmFjZT0iYm9sZCIpDQoNCg0KVFAyX1Byb3RTeW0ucGxvdC5jdXQ8LWdncGxvdChUUDJfUHJvdFN5bS5zdW0sIGFlcyh4PVNpdGUsIHk9VFBfdWcuY20yX1MsIGNvbG91cj1TaXRlLk9yaWcpKSArIA0KICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1PcmlnLmNvbG9ycy5vKSsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1UUF91Zy5jbTJfUy1zZSwgeW1heD1UUF91Zy5jbTJfUytzZSksIHdpZHRoPWNhcC5zeiwgbGluZXdpZHRoPWJhci5zeiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC41KSkgKw0KICBnZW9tX3BvaW50KHNpemU9cG9pbnQuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCANCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIikrDQogIGxhYnMoeD0iIiwgeT0iIiwgY29sb3VyPSJPcmlnaW4iKSsNCiAgeWxpbSgyNTAsIDU1MCkNCg0KVFAzX1Byb3RTeW0ucGxvdC5jdXQ8LWdncGxvdChUUDNfUHJvdFN5bS5zdW0sIGFlcyh4PVNpdGUsIHk9VFBfdWcuY20yX1MsIGNvbG91cj1TaXRlLk9yaWcpKSArIA0KICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1PcmlnLmNvbG9ycy5vKSsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1UUF91Zy5jbTJfUy1zZSwgeW1heD1UUF91Zy5jbTJfUytzZSksIHdpZHRoPWNhcC5zeiwgbGluZXdpZHRoPWJhci5zeiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC41KSkgKw0KICBnZW9tX3BvaW50KHNpemU9cG9pbnQuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCANCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uPSJub25lIikrDQogIGxhYnMoeD0iIiwgeT0iIiwgY29sb3VyPSJPcmlnaW4iKSsNCiAgeWxpbSgyNTAsIDU1MCkNCg0KVFA0X1Byb3RTeW0ucGxvdC5jdXQ8LWdncGxvdChUUDRfUHJvdFN5bS5zdW0sIGFlcyh4PVNpdGUsIHk9VFBfdWcuY20yX1MsIGNvbG91cj1TaXRlLk9yaWcpKSArIA0KICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1PcmlnLmNvbG9ycy5vKSsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1UUF91Zy5jbTJfUy1zZSwgeW1heD1UUF91Zy5jbTJfUytzZSksIHdpZHRoPWNhcC5zeiwgbGluZXdpZHRoPWJhci5zeiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC41KSkgKw0KICBnZW9tX3BvaW50KHNpemU9cG9pbnQuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCANCiAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9bGVnLnR4dC5zeiksIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT1sZWcudGl0bGUuc3opLCANCiAgICAgICAgbGVnZW5kLmJveC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yID0gImJsYWNrIikpKw0KICBsYWJzKHg9IiIsIHk9IiIsIGNvbG91cj0iT3JpZ2luIikrDQogIHlsaW0oMjUwLCA1NTApDQoNCg0KIyNDaGxvcm9waHlsbA0KVFAxX0NobC5wbG90LmN1dDwtZ2dwbG90KFRQMV9DaGwuc3VtLCBhZXMoeD1TaXRlLCB5PUNobF91Zy5jbTIsIGNvbG91cj1TaXRlLk9yaWcpKSArIA0KICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1PcmlnLmNvbG9ycy5vKSsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1DaGxfdWcuY20yLXNlLCB5bWF4PUNobF91Zy5jbTIrc2UpLCB3aWR0aD1jYXAuc3osIGxpbmV3aWR0aD1iYXIuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpICsNCiAgZ2VvbV9wb2ludChzaXplPXBvaW50LnN6LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCANCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKw0KICBsYWJzKHg9IlNpdGUiLCB5PWV4cHJlc3Npb24ocGFzdGUoJ1RvdGFsIENobG9yb3BoeWxsIChcdTAzQkNnIGNtJ14tMioiKSIpKSwgY29sb3VyPSJPcmlnaW4iKSsNCiAgeWxpbSgwLjUsIDMuMjUpKw0KICBhbm5vdGF0ZSgidGV4dCIsIHg9MiwgeT0xLjcsIGxhYmVsPSIqKioiLCBzaXplPWxldmVscy5zeiwgZm9udGZhY2U9ImJvbGQiKQ0KDQoNClRQMl9DaGwucGxvdC5jdXQ8LWdncGxvdChUUDJfQ2hsLnN1bSwgYWVzKHg9U2l0ZSwgeT1DaGxfdWcuY20yLCBjb2xvdXI9U2l0ZS5PcmlnKSkgKyANCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXM9T3JpZy5jb2xvcnMubykrDQogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49Q2hsX3VnLmNtMi1zZSwgeW1heD1DaGxfdWcuY20yK3NlKSwgd2lkdGg9Y2FwLnN6LCBsaW5ld2lkdGg9YmFyLnN6LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpKSArDQogIGdlb21fcG9pbnQoc2l6ZT1wb2ludC5zeiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC41KSkrDQogIHRoZW1lX2NsYXNzaWMoKSsNCiAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KHNpemUgPSBheGlzLnRpdGxlLnN6KSwgDQogICAgICAgIGF4aXMudGV4dC54PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIGF4aXMudGV4dC55PWVsZW1lbnRfdGV4dChzaXplPWF4aXMudHh0LnN6LCBjb2xvdXI9ImJsYWNrIiksIA0KICAgICAgICBsZWdlbmQucG9zaXRpb249Im5vbmUiKSsNCiAgbGFicyh4PSJTaXRlIiwgeT0iIiwgY29sb3VyPSJPcmlnaW4iKSsNCiAgeWxpbSgwLjUsIDMuMjUpKw0KICBhbm5vdGF0ZSgidGV4dCIsIHg9YygxLDIpLCB5PWMoMS43LCAyLjYpLCBsYWJlbD0iKiIsIHNpemU9bGV2ZWxzLnN6LCBmb250ZmFjZT0iYm9sZCIpDQoNCg0KVFAzX0NobC5wbG90LmN1dDwtZ2dwbG90KFRQM19DaGwuc3VtLCBhZXMoeD1TaXRlLCB5PUNobF91Zy5jbTIsIGNvbG91cj1TaXRlLk9yaWcpKSArIA0KICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcz1PcmlnLmNvbG9ycy5vKSsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1DaGxfdWcuY20yLXNlLCB5bWF4PUNobF91Zy5jbTIrc2UpLCB3aWR0aD1jYXAuc3osIGxpbmV3aWR0aD1iYXIuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpICsNCiAgZ2VvbV9wb2ludChzaXplPXBvaW50LnN6LCBwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSh3aWR0aD0wLjUpKSsNCiAgdGhlbWVfY2xhc3NpYygpKw0KICB0aGVtZShheGlzLnRpdGxlLnggPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCBheGlzLnRpdGxlLnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGF4aXMudGl0bGUuc3opLCANCiAgICAgICAgYXhpcy50ZXh0Lng9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgYXhpcy50ZXh0Lnk9ZWxlbWVudF90ZXh0KHNpemU9YXhpcy50eHQuc3osIGNvbG91cj0iYmxhY2siKSwgDQogICAgICAgIGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIpKw0KICBsYWJzKHg9IlNpdGUiLCB5PSIiLCBjb2xvdXI9Ik9yaWdpbiIpKw0KICB5bGltKDAuNSwgMy4yNSkrDQogIGFubm90YXRlKCJ0ZXh0IiwgeD0xLCB5PTEuNywgbGFiZWw9Ii0iLCBzaXplPWxldmVscy5zeiwgZm9udGZhY2U9ImJvbGQiKQ0KDQpUUDRfQ2hsLnBsb3QuY3V0PC1nZ3Bsb3QoVFA0X0NobC5zdW0sIGFlcyh4PVNpdGUsIHk9Q2hsX3VnLmNtMiwgY29sb3VyPVNpdGUuT3JpZykpICsgDQogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPU9yaWcuY29sb3JzLm8pKw0KICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPUNobF91Zy5jbTItc2UsIHltYXg9Q2hsX3VnLmNtMitzZSksIHdpZHRoPWNhcC5zeiwgbGluZXdpZHRoPWJhci5zeiwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2Uod2lkdGg9MC41KSkgKw0KICBnZW9tX3BvaW50KHNpemU9cG9pbnQuc3osIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKHdpZHRoPTAuNSkpKw0KICB0aGVtZV9jbGFzc2ljKCkrDQogIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChzaXplID0gYXhpcy50aXRsZS5zeiksIA0KICAgICAgICBheGlzLnRleHQueD1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCBheGlzLnRleHQueT1lbGVtZW50X3RleHQoc2l6ZT1heGlzLnR4dC5zeiwgY29sb3VyPSJibGFjayIpLCANCiAgICAgICAgbGVnZW5kLnRleHQ9ZWxlbWVudF90ZXh0KHNpemU9bGVnLnR4dC5zeiksIGxlZ2VuZC50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT1sZWcudGl0bGUuc3opLCANCiAgICAgICAgbGVnZW5kLmJveC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yID0gImJsYWNrIikpKw0KICBsYWJzKHg9IlNpdGUiLCB5PSIiLCBjb2xvdXI9Ik9yaWdpbiIpKw0KICB5bGltKDAuNSwgMy4yNSkNCmBgYA0KDQoNCiMjIyMgRmlndXJlIFMzDQpgYGB7cn0NCiMjQ3JlYXRlIFBhbmVsDQpQaHlzX2ZpZzwtcGxvdF9ncmlkKA0KICBUUDFfQmlvSG9zdC5wbG90LmN1dCxUUDJfQmlvSG9zdC5wbG90LmN1dCxUUDNfQmlvSG9zdC5wbG90LmN1dCxUUDRfQmlvSG9zdC5wbG90LmN1dCwNCiAgVFAxX0Jpb1N5bS5wbG90LmN1dCxUUDJfQmlvU3ltLnBsb3QuY3V0LFRQM19CaW9TeW0ucGxvdC5jdXQsVFA0X0Jpb1N5bS5wbG90LmN1dCwNCiAgVFAxX1Byb3RTeW0ucGxvdC5jdXQsVFAyX1Byb3RTeW0ucGxvdC5jdXQsVFAzX1Byb3RTeW0ucGxvdC5jdXQsVFA0X1Byb3RTeW0ucGxvdC5jdXQsDQogIFRQMV9DaGwucGxvdC5jdXQsVFAyX0NobC5wbG90LmN1dCxUUDNfQ2hsLnBsb3QuY3V0LFRQNF9DaGwucGxvdC5jdXQsDQogICAgICAgICAgICAgICAgICAgIHJlbF93aWR0aHM9YyhyZXAoYygwLjc1LCAwLjc1LCAwLjc1LDEpLDQpKSwgDQogICAgICAgICAgICAgICAgICAgIHJlbF9oZWlnaHRzID0gYygxLDAuODUsMC44NSwwLjg1KSwNCiAgICAgICAgICAgICAgICAgICAgbnJvdz00LCBuY29sPTQsIGJ5cm93PVQsIGxhYmVscyA9IE5VTEwpDQoNCiMjU2F2ZSBGaWd1cmUNCmdnc2F2ZShmaWxlbmFtZT0iRmlndXJlcy8wMl9QaHlzaW9sb2d5L0ZpZ1MzX1BoeXNpb2xvZ3lNZXRyaWNzLnBuZyIsIHBsb3Q9UGh5c19maWcsIGRwaT0zMDAsIHdpZHRoPTEyLCBoZWlnaHQ9MTQsIHVuaXRzPSJpbiIpDQoNCmBgYA0KDQo=